如何在NHibernate中映射ZeroToOne关系?

时间:2013-02-12 16:40:18

标签: c# nhibernate nhibernate-mapping

我是NHibernate的新手,不知道如何映射ZeroToOne关系:

涉及3个表

Discounts
DiscountRequests
Requests

两者的主键在DiscountRequests中成对存储,并非所有折扣都有请求,并非所有请求都有折扣。

每个主键仅在DiscountRequests中显示一次,因此DiscountDiscountRequests具有一对一的关系,Requests的关系相同。

任何人都知道如何映射这个,这样一个Discount对象可以保存对它的引用请求,如果它有一个请求对象持有对折扣的引用(如果有)。否则他们将持有一个空对象。

1 个答案:

答案 0 :(得分:4)

这是一个有趣的关系案例,因为它不是经典的一对一 - 你没有一方是关系的所有者。这意味着您必须有一个间接的“多对多”表,如您的示例所示。最简单的解决方案是将其映射为NHibernate中的集合,但如果在您的域中您不能拥有多个项目,那就太奇怪了。

但有联接可以提供帮助。 Join mapping允许您以对域对象透明的方式将一个实体拆分为多个数据库表。现在,您可以在Discount映射中找到类似的内容:

<join table="DiscountRequests" optional="true">
    <key column="DiscountId" />
    <many-to-one name="Request" column="RequestId" />
</join>

Request方面的类似内容:

<join table="DiscountRequests" optional="true">
    <key column="RequestId" />
    <many-to-one name="Discount" column="DiscountId" />
</join>

实际上,就像DiscountRequests表被拆分为两个而对Request的引用分别转到Discount对象和其他方向。

请记住在RequestIdDiscountId上都有唯一约束,这样就不会有多行加入。

我还会检查使用分析器对保存和更新没有不良影响,但我没想到。