Хранение заказанной детской коллекции в NHibernate - PullRequest
1 голос
/ 02 декабря 2009

У меня возникли проблемы с тем, как мне следует реализовать упорядоченные отношения ребенка с 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, а не перемешивал остальные?

Спасибо

1 Ответ

1 голос
/ 03 декабря 2009

Inverse=true означает, что NHib не будет пытаться сохранить фактическую коллекцию. Однако он все равно будет каскадом операции сохранения через коллекцию для содержащихся сущностей, которая включает в себя постоянные временные экземпляры. Вот почему вы получаете вставку без SortOrder - NHib сохраняет ваш временный Child объект.

Был аналогичный вопрос , где решение включало переход к <bag> отображениям, но при этом теряются упорядоченные качества, которыми обладает <list>.

Теперь я использовал <list> раньше с <many-to-many> отображением, и там он отлично работал. Было два вызова вставки SQL - один для таблицы, содержащей дочернюю сущность, а другой для таблицы связывания. Я подозреваю, что в вашем случае NHib по-прежнему применяет одну и ту же стратегию, хотя оба вызова относятся к одной и той же таблице.

И, наконец, если вы удалите элемент с индексом 0, то получите нулевое значение.

Итак, в целом, я бы предложил: 1) перейти к отображению <bag> для вашей коллекции и сохранить определенное свойство для порядка сортировки; или 2) перейти к отображению <many-to-many> внутри вашей коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...