2009-12-02 2 views
1

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

Благодаря

ответ

1

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

Было a similar question, где решение касалось перемещения к <bag> сопоставлениям, но это теряет качества заказа, которые <list> имеет.

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

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

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

Смежные вопросы