nhibernate - 使用 Fluent NHibernate 删除一对一关系中的实体时出现级联问题

标签 nhibernate fluent-nhibernate one-to-one

我有以下数据库表,我已为此示例进行了简化:

网页 Id、URLIdentifier

WebpageMetaData Webpage_id 关键字

Webpage_id 是表的主键,也是返回网页表的外键。

然后,我使用 Fluent NHibernate 及其自动映射功能将它们映射到以下 POCO 类:

public class Webpage
{
    public virtual int Id { get; set; }
    public virtual string UrlIdentifier { get; set; }
    public virtual WebpageMetaData WebpageMetaData { get; set; }

}

public class WebpageMetaData
{
    public virtual int Id { get; set; }
    public virtual string Keywords{ get; set; }
    public virtual Webpage Webpage { get; set; }

}

我想将这些实体一对一映射,因此我按如下方式重写自动映射:

public class WebpageMap : IAutoMappingOverride<Webpage>
{        
    public void Override(AutoMapping<Webpage> mapping)
    {
        mapping.HasOne(w => w.WebpageMetaData)
            .Not.Constrained()
            .Fetch.Join()
            .Cascade.All();
    }
}

public class WebpageMetaDataMap : IAutoMappingOverride<WebpageMetaData>
{
    public void Override(AutoMapping<WebpageMetaData> mapping)
    {
        mapping.Id(w => w.Id, "Webpage_id").GeneratedBy.Foreign("Webpage");

        mapping.HasOne(w => w.Webpage)
            .ForeignKey("Webpage_id")
            .Constrained()
            .Fetch.Join()
            .Cascade.None();
    }
}

我已经测试了这些映射和级联规则,它们适用于选择、插入和更新。但是,当我删除 WebpageMetaData 时,我收到一个异常消息

“已删除的对象将通过级联重新保存(从关联中删除已删除的对象)[WebpageMetaData#524]”

停止异常的唯一方法是在保存之前执行以下操作:

webpageMetaData.Webpage.WebpageMetaData = null;

所以我必须从我的 parent 那里设置一个对我自己的空引用??!这似乎是错误的?我的映射错误吗?

谢谢。

更新 1: 请参阅 FLuent 生成的 NH 映射,以防这对 NHibernate 的核心有所帮助:)

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Webpage`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="Id" />
      <generator class="identity" />
    </id>
    <one-to-one cascade="all" class="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="false" fetch="join" name="WebpageMetaData" />
    <property name="UrlIdentifier" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="UrlIdentifier" />
    </property>    
  </class>
</hibernate-mapping>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`WebpageMetaData`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="Webpage_id" />
      <generator class="foreign">
        <param name="property">Webpage</param>
      </generator>
    </id>
    <one-to-one cascade="none" class="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="true" fetch="join" foreign-key="Webpage_id" name="Webpage" />
    <property name="Keywords" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Keywords" />
    </property>
  </class>
</hibernate-mapping>

最佳答案

我认为你的映射不太正确。如果你看一下NH documentation ,他们使用一对一建立父子关系的示例涉及多对一映射(unique=true)和一对一映射,而不是一对一对一映射。 (一对一映射适用于两个表使用共享 PK 关联的情况)

我建议您尝试更改映射以更好地匹配示例,看看是否可以修复级联。

关于nhibernate - 使用 Fluent NHibernate 删除一对一关系中的实体时出现级联问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1996860/

相关文章:

nhibernate - 你能解释 GeneratedBy.HiLo(...) 的参数是什么吗?

java - JPA中表之间的关系是如何设置的?

c# - 使用 NHibernate 性能问题获取大块数据

NHibernate 'Write Only' 集合,是否有这样的东西?

c# - 关联引用未映射类 : System. Guid

nhibernate - 流畅的 NHibernate - IndexOutOfRange

c# - 在另一个程序集中扩展流畅的 nhibernate 映射

NHibernate 将保存,但不会加载实体

php - 使用另一个 mysql/php 中一个表的数据

java - Hibernate 一对一单向主键 XML 映射