NHibernate каскадные проблемы - PullRequest
0 голосов
/ 26 марта 2011

У меня есть это отображение в одном классе:

<class name="Parent">
<set name="Activity" table="ChangeLogs" order-by="ChangeDate desc" cascade="all-delete-orphan">
  <key column="RequestID" />
  <one-to-many class="ChangeLog" />
</set>

А это в другом:

<class Name="Child">
<many-to-one name="Request" class="Request" column="RequestID" />

В родительском, загруженном в текущую транзакцию, я добавляю в коллекцию:

parent.Activity.Add(new Child(){/* properties, etc */});

А потом я совершаю транзакцию. Любые изменения в родительском элементе сохраняются в базе данных с помощью вызова обновления, но я не могу заставить этих дочерних элементов вставлять, независимо от значений каскада или inverse = true / false / just-save-Уже. Некоторое время я бился головой об этом, читая примеры / документацию / и т. Д., И я не понимаю, почему это не сработало. Я что-то упустил? Я убивал сервер и перестраивал после каждого изменения, чтобы убедиться, что все обновляется, но нада.

Что еще хуже, иногда сработал , с различными значениями для инверсии, иногда путем добавления Request = parent к дочернему элементу, иногда путем сохранения дочернего элемента отдельно перед добавлением ... перестает работать позже. Я ошеломляю o_O

edit: После того, как это было опубликовано, были предприняты попытки, перестройка + перезапуск сервера между каждым, ни один из которых не вызывает вызов вставки или ошибки:

<set inverse=true>
parent.Activity.Add(new Child(){Request=parent})
<set inverse=true>
parent.Activity.Add(new Child(){})
<set>
parent.Activity.Add(new Child(){Request=parent})
<set>
parent.Activity.Add(new Child(){})
<set inverse=false>
parent.Activity.Add(new Child(){Request=parent})
<set inverse=false>
parent.Activity.Add(new Child(){})

Это сработало:

<set>
Child c = new Child() {Request = parent};
parent.Activity.Add(c);
Session.Save(c);

Но тогда какой смысл устанавливать каскад, если он игнорируется?

изменить: после прочтения немного этого: http://nhibernate.info/doc/nh/en/index.html#example-parentchild-bidir Я пытался:

<class Name="Child">
<many-to-one name="Request" class="Request" column="RequestID" not-null=true />

со всеми 6 основными из них выше, без удачи.

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Для меня всегда проблема установить его правильно за один раз. Сначала все выглядит хорошо в вашем коде, но мне интересно, на какой стороне вы устанавливаете обратное свойство?

Этот код работает для меня:

<class name="Parent" table="Parent">

<bag name="Languages" inverse="true" cascade="all-delete-orphan" lazy="false" fetch="join">
  <key column="parentId" />
  <one-to-many class="Language" />
</bag>

<class name="Language" table="Language">

<many-to-one column="parentId" name="Parent" class="Parent" not-null="true" />

Надеюсь, это поможет.

0 голосов
/ 26 марта 2011

Это правильное отображение:

<class name="Parent">
  ...
  <set cascade="all-delete-orphan" inverse="true" ...>
  ...
  </set>
</class>
<class name="Child">
  ...
  <many-to-one .../>
</class>

И правильное использование (предполагается, что родитель уже существует):

using (var tx = session.BeginTransaction())
{
    var parent = GetParent();
    parent.Collection.Add(new Child { Parent = parent });
    tx.Commit();
}
...