继续NHibernate one-to-one vs 2 many-to-one
是否有一种简单的方法来维护多个一对多关系,这些关系被用作伪一对一的关系。
E.g。
如果我有两个实体,User和Contact,它们各自与一个FK相关(User.ContactId和Contact.UserID)。
保持每个参考点在另一个参考点的最佳方法是什么。系统使用其他联系人更新用户是错误的,但联系人仍然引用用户...
答案 0 :(得分:2)
如果删除其中一个冗余外键,很可能根本不需要维护它。您的数据库模式不应该允许这样的异常(userX引用contactX但contactX引用userY)。从概念上讲,您在用户和联系人之间存在一对一的关系。为什么不在NHibernate映射中一对一?如果这是因为在NHibernate中对于可以为空的一对一的延迟加载not supported?这个问题有一个解决方案,它不涉及数据库中的冗余外键。
1)在用户映射中定义一个虚假列表。列表只能有一个或零个项目。零被视为NULL(无联系)。
<bag
name="_contact"
table="UserContacts"
lazy="true"
inverse="true"
cascade="all-delete-orphan" >
<key column="UserId" />
<one-to-many class="Contact" />
</bag>
在联系人映射中定义一对一:
<one-to-one name="_user" class="User" constrained="true" />
在数据库中,您需要拥有PK Users.Id和一个(!)外键Contacts.UserID。
2)另一种选择是在用户映射和一个FK Users.ContactId
中简单地使用多对一<many-to-one
name="_contact"
column="ContactId"
cascade="all-delete-orphan"
unique="true"
lazy="proxy"/>
无论哪种方式,都不需要您询问的维护,也不可能出现异常。