【问题标题】:NHibernate many-to-one and unique constraint violationNHibernate 多对一和唯一约束违规
【发布时间】:2008-11-14 14:53:19
【问题描述】:

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

谢谢,

马丁

【问题讨论】:

    标签: database nhibernate nhibernate-mapping


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      假设您有两个不同的 People 对象,每个对象都有一个对不同 Country 对象的引用。只要 Country IDs 相同,您就不会遇到异常,并且数据库中只有 1 个 Country。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2022-09-23
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-10
        相关资源
        最近更新 更多