c# - nhibernate 一对一映射和非空 ="false"?

标签 c# .net nhibernate

如何使用 NHibernate 创建一对一的关系,而另一方可能是 NULL? 例如,我有一个 Banner 实体,它与 Image 实体有这样的关系:

<class name="Banner" table="Banner">
    <id name="Id" type="Int64" unsaved-value="0">
        <generator class="native" />
    </id>

    <many-to-one name="Image" unique="true" column="ImageId" not-null="false"/>

    <!-- check: In the example this property was without inverse attribute -->
    <set name ="BannerSlideSet" fetch="subselect" inverse="true">
        <key column="Banner_ID" foreign-key="FK_Banner_BannerSlide" not-null="false" />
        <one-to-many class="BannerSlide"/>
    </set>
</class>

因此,对于 Banner 实体,Image 可以为 null。 我创建了一个没有图像的横幅实体,没有任何问题。 在数据库中,我有

--------------
ID  | ImageId
--------------
 1  | NULL

在那之后,我尝试创建第二个没有图像的 Banner 实例并得到以下错误:

NHibernate.Exceptions.GenericADOException: could not insert: [Domain.Entities.Banner][SQL: INSERT INTO Banner (ImageId) VALUES (?); select SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UQ_Banner_7516F70DE6141471'. Cannot insert duplicate key in object 'dbo.Banner'. The duplicate key value is ().

我猜,这是因为我对横幅和图像实体之间的一对多关系有唯一约束,并且多个 Banner 实例不能在 ImageId 字段中有多个 NULL 值。问题:如何在 NHinerbate 中实现一对一可空关系?

谢谢!

最佳答案

解决方案是将 ImageId Banner 表中移动。并将它放在 Image 表中。

这样,只要我们有真实的(不是空的)图像,我们就可以:

  1. 通过 Image 引用 Banner (BannerId)(多对一 从图像端,并从 Banner 端收集一对多图像)或
  2. 使用真正的一对一关系:ImageId 是不受约束的,由拥有 Banner 的 BannerId 生成。<

这是文档中的示例 5.1.11. one-to-one , 调整为横幅和图片

Now we must ensure that the primary keys of related rows in the BANNER and IMAGE tables are equal. We use a special NHibernate identifier generation strategy called foreign:

图像映射:

<class name="Image" table="[Image]">
    <id name="Id" column="[ImageId]">
        <generator class="foreign">
            <param name="property">Banner</param>
        </generator>
    </id>
    ...
    <one-to-one name="Banner" class="Banner" constrained="true"/>
</class>

横幅:

 <one-to-one name="Image" class="Image"/>

关于c# - nhibernate 一对一映射和非空 ="false"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19073568/

相关文章:

调用 WCF 的 Java 应用程序返回 "Connection Reset",而 SoapUI 工作正常

c# - 将 List<int> 转换为 List<List<int>>

.net - 我的应用程序将所有 "1"数字变成红色,就像巫术一样

c# - C# : how to run a few test from the same class in parallel way 的 NUnit 3.0.1

C# Selenium XPATH 根据 Span 中的文本单击输入

c# - append 到文本文件(不覆盖!)

.net - AssemblyFileVersion 属性被忽略

c# - Fluent NHibernate - 集合不过滤

c# - linq如何通过在查询中加入和分离where来nhibernate

c# - 没有 NHibernate 的 NHibernate Hilo 序列