我必须有一个简单的答案,我错过了。我已经看到很多关于如何在一个简单的父/子关系中做到这一点的例子,但是当我有第三个表时我不知道怎么做。我对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上建立帐户关联?
答案 0 :(得分:1)
“为什么我必须合并才能确保删除电话号码”:
要么是因为你从更改跟踪中删除了Phonenumbers(用于加载本书的关闭会话),要么因为合并时没有Flush,而且立即刷新SaveOrUpdate只会添加到下一个会话中执行的批处理。齐平()。
“它也会删除帐户”
可能是因为:
<bag cascade="all" class="Account" name="Accounts">
</bag>