NHibernate多对一和唯一约束违规

时间:2008-11-14 14:53:19

标签: database nhibernate nhibernate-mapping

我试图在NHibernate中建模多对一关系时遇到问题,其中“一”侧的对象对列有唯一约束。问题如下:

我有两张桌子,'人'和'国家'。每个人都有一个且只有一个与之相关的国家。一个国家可以有很多人(真的!:))和国家名称是唯一的。以下是人员方面的映射:

<many-to-one Name="Country">
<column Name="CountryId"/>
</many-to-one>

在乡下:

<property name="Name" unique="true">
<column name="Name" length="50">
</property>

现在在数据库中,我在Country表的Name列中添加了一个唯一约束。如果我在Person实例上调用Save(),NHibernate只是尝试执行INSERTS,而我希望它检查是否存在Country Name并在Person表的CountryID列中使用它的ID。相反,抛出的异常是由于违反数据库中的唯一约束而导致的。

在我看来,Nibernate应该有足够的映射元数据来做正确的事情(或者属性上的唯一属性不能确保这个吗?)。有谁知道如何做到这一点或有一个解决方法?

谢谢,

Martijn

2 个答案:

答案 0 :(得分:6)

您需要将一个Country实例分配给Person实例的Country属性(而不仅仅是设置ID)。类似的东西:

Person p = new Person();
p.Country = session.Load<Country>(countryId);
session.Save(p);

然后NHibernate会知道该怎么做。这也不会导致数据库命中检索国家/地区,因为Load方法将返回一个国家/地区代理,您访问的唯一内容是国家/地区实例的ID。

答案 1 :(得分:0)

我有类似的要求,并使用 SaveOrUpdateCopy 解决了这个问题。

假设您有两个不同的People对象,每个对象都有一个不同的Country对象。只要国家 ID 相同,您就不会获得例外,只有1个国家/地区将在数据库中。

这种方法的唯一方法是在调用SaveOrUpdateCopy之前需要为Country对象分配一个ID。