【发布时间】:2012-03-30 15:14:09
【问题描述】:
我有一个包含电话号码列表的电话簿类。然后我有另一个引用PhoneNumber的类“Account”。此引用可以为空,因此帐户不必有电话号码。
我希望能够保存电话簿,让它保存/更新/删除所有电话号码,如果任何电话号码被删除,我想取消使用此号码的任何帐户。除了最后一部分,一切都在工作;如果我删除正在使用的电话号码,它也会删除帐户,我不想发生这种情况,我只是希望它清除它的参考。我确定这只是因为我的级联或映射错误,我只是不知道将它们设置为什么。
实际保存的代码比较简单。顺便说一句,如果有人能告诉我为什么我必须合并以确保删除电话号码,那就太棒了。
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>
...
电话号码.hbm.xml
...
<many-to-one cascade="none" class="DataLibrary.dto.PhoneBookDto, DataLibrary" name="PhoneBook">
<column name="phone_book_id" />
</many-to-one>
...
帐户.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 与 Account 关联起来?
【问题讨论】:
-
您是否在 PhoneNumber 中使用 Cascade.remove 收集帐户?
标签: nhibernate mapping parent-child cascade