У меня возникают проблемы с тем, как я должен реализовать упорядоченные дочерние отношения с NH.Хранение заказанной детской коллекции в NHibernate
В коде мира, у меня есть:
class Parent
{
public Guid Id;
public IList<Child> Children;
}
class Child
{
public Guid Id;
public Parent Parent;
}
Parent
имеет список Child[ren]
с заказом. На самом деле коллекция Children
будет содержать уникальные Child
s, которые будут исполняться другим кодом (т. Е. Никогда не удастся добавить одного и того же ребенка в коллекцию дважды, поэтому я не хочу действительно заботиться о, если коллекция NH обеспечивает это)
Как реализовать сопоставления для обоих классов?
Из моего понимания:
Bags
не имеет порядка, поэтому я не хочу этоSets
не имеет порядка, но я мог бы использоватьorder-by
сделать некоторую SQL упорядоченности, но что я приказать? Я не могу полагаться на последовательный идентификатор. так что я не хочу этого?Lists
представляют собой коллекцию без дубликатов, где уникальный ключ - этоPK
и столбецindex
, так что я хочу этого?
Таким образом, используя в list
, у меня есть следующие:
<list cascade="all-delete-orphan" inverse="true" name="Children">
<key>
<column name="Parent_id" />
</key>
<index>
<column name="SortOrder" />
</index>
<one-to-many class="Child" />
</list>
Когда я вставляю родителей, когда ребенок на него, я вижу следующий SQL:
Insert into Child (id, Parent_id) values (@p0, @p1)
Ie, почему он не вставляет SortOrder?
Если я делаю SchemaExport
, столбец SortOrder создается в таблице Child.
:(
Если установить Inverse="false"
на отношениях, я вижу один и тот же SQL, как описано выше, а затем:
UPDATE "Child" SET Parent_id = @p0, SortOrder = @p1 WHERE Id = @p2
Почему это до сих пор INSERT
PARENT_ID с inverse="false"
и почему не это вставить SortOrder с inverse="true"
?
ли я приближается это совершенно неправильно?
Это также верно, что если предположить, это работало, если бы я был сделать:
parentInstance.Children.Remove(parentInstance.Children[0]);
сохранить родителя и перезагрузить его, что list
будет иметь нуль в положение 0, а перетасовка остальное вверх?
Благодаря