如何使用 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
表中。
这样,只要我们有真实的(不是空的)图像,我们就可以:
- 通过 Image 引用 Banner (
BannerId
)(多对一
从图像端,并从 Banner 端收集一对多
图像)或 - 使用真正的
一对一
关系: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/