4

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

我有两张表,“Person”和“Country”。每个人都有一个且只有一个与之关联的国家。一个国家可以有很多人(真的!:)),一个国家的名字是唯一的。以下是Person端的映射:

<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 应该有足够的映射元数据来做正确的事情(或者属性上的唯一属性不能确保这一点?)。有谁知道如何做到这一点或有解决方法?

谢谢,

马汀

4

2 回答 2

6

您需要将 Country 实例分配给 Person 实例的 Country 属性(不仅仅是设置 ID)。就像是:

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

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

于 2008-11-14T21:40:56.610 回答
0

我有类似的要求并使用SaveOrUpdateCopy解决了它。

假设您有两个不同的 People 对象,每个对象都有对不同 Country 对象的引用。只要国家/地区ID相同,您就不会出现异常,并且只有 1 个国家/地区会在数据库中。

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

于 2009-09-14T08:31:10.563 回答