У меня возникли проблемы с тем, как мне следует реализовать упорядоченные отношения ребенка с NH.
В мире кода у меня есть:
class Parent
{
public Guid Id;
public IList<Child> Children;
}
class Child
{
public Guid Id;
public Parent Parent;
}
A 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)
То есть, почему он не вставляет SortOrder?
Если я сделаю SchemaExport
, столбец SortOrder будет создан в дочерней таблице.
(
Если я установлю 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, а не перемешивал остальные?
Спасибо