保持多个一对多

时间:2011-08-10 04:48:35

标签: nhibernate fluent-nhibernate entity-relationship foreign-key-relationship

继续NHibernate one-to-one vs 2 many-to-one

是否有一种简单的方法来维护多个一对多关系,这些关系被用作伪一对一的关系。

enter image description here

E.g。

如果我有两个实体,User和Contact,它们各自与一个FK相关(User.ContactId和Contact.UserID)。

保持每个参考点在另一个参考点的最佳方法是什么。系统使用其他联系人更新用户是错误的,但联系人仍然引用用户...

1 个答案:

答案 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"/>

无论哪种方式,都不需要您询问的维护,也不可能出现异常。