NHibernate - 在引用的对象被删除时将外键设置为null

时间:2012-03-14 06:58:14

标签: nhibernate mapping parent-child cascade

我必须有一个简单的答案,我错过了。我已经看到很多关于如何在一个简单的父/子关系中做到这一点的例子,但是当我有第三个表时我不知道怎么做。我对NHibernate也比较陌生,所以请光临我。

我有一个PhoneBook类,其中包含PhoneNumber列表。然后我有另一个类“帐户”,它引用了PhoneNumber。此引用可以为空,因此帐户不必具有电话号码。

我希望能够保存电话簿,保存/更新/删除所有电话号码,如果删除了任何电话号码,我想使用此号码取消任何帐号。除了最后一部分,一切都在工作;如果我删除了正在使用的电话号码,它也会删除该帐户,我不想发生这种情况,我只是希望它清除它的参考。我确定这只是因为我的级联或映射是错误的,我只是不知道该如何设置它们。

要保存的实际代码相对简单。顺便说一句,如果有人可以告诉我为什么我必须合并,以确保删除电话号码真棒。

var session = SessionFactory.GetCurrentSession();
book = (PhoneBookDto) session.Merge(book);
session.SaveOrUpdate(book);

当前相关映射:

PhoneBook.hbm.xml

...
<bag cascade="all-delete-orphan" inverse="true" name="PhoneNumbers">
  <key>
    <column name="phone_book_id" />
  </key>
  <one-to-many class="DataLibrary.dto.PhoneNumberDto, DataLibrary" />
</bag>
...

PhoneNumber.hbm.xml

...

<many-to-one cascade="none" class="DataLibrary.dto.PhoneBookDto, DataLibrary" name="PhoneBook">
  <column name="phone_book_id" />
</many-to-one>

...

Account.hbm.xml

...

<many-to-one cascade="none" class="DataLibrary.dto.PhoneNumberDto, DataLibrary" name="PhoneNumber">
  <column name="phone_number_id" />
</many-to-one>

...

提前致谢!

编辑:

Firo指出我正确的方向,我不得不将PhoneNumber上的一个集合设置回Account,即使我并不真的需要它,并将其设置为inverse = false:

<bag cascade="none" inverse="false" name="Accounts">
  <key>
    <column name="phone_number_id" />
  </key>
  <one-to-many class="DataLibrary.dto.AccountDto, DataLibrary" />
</bag>

当我这样做时,它起作用了。有没有办法做到这一点所以我不需要在PhoneNumber上建立帐户关联?

1 个答案:

答案 0 :(得分:1)

“为什么我必须合并才能确保删除电话号码”:

要么是因为你从更改跟踪中删除了Phonenumbers(用于加载本书的关闭会话),要么因为合并时没有Flush,而且立即刷新SaveOrUpdate只会添加到下一个会话中执行的批处理。齐平()。

“它也会删除帐户”

可能是因为:

<bag cascade="all" class="Account" name="Accounts">
</bag>