流畅的NHibernate - 多个附加表 - 无法在删除期间插入NULL异常

时间:2017-10-12 14:53:31

标签: nhibernate many-to-many fluent-nhibernate fluent-nhibernate-mapping

我与其他表格存在多对多的关系,当我尝试删除 A 对象时,该对象在 AB 表中也有引用:

  

$ exception {"无法删除集合:[A.AB#20] [SQL:   UPDATE AB SET AId =   null WHERE AId =   @ p0]"} NHibernate.Exceptions.GenericADOException

     

无法将值NULL插入列' AId',   表' AB&#39 ;;柱   不允许空值。更新失败。声明已经终止。

我的数据库架构: enter image description here

我的课程:

public class A
{
    public virtual int AId { get; protected set; }

    public virtual IList<AB> AB { get; set; }
}

public class B
{
    public virtual int BId { get; protected set; }

    public virtual IList<AB> AB { get; set; }
}

public class AB
{
    public virtual int ABId { get; protected set; }

    public virtual A A { get;  set; }

    public virtual B B { get; set; }

    public virtual int CustomProperty { get; set; }
}

我的映射:

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Table("A");

        SchemaAction.None();

        Id(x => x.AId)
            .GeneratedBy.Identity();

        HasMany(x => x.AB)
            .KeyColumn("AId")
            .Cascade.All();
    }
}

public class BMap : ClassMap<B>
{
    public BMap()
    {
        Table("B");

        SchemaAction.None();

        Id(x => x.BId)
            .GeneratedBy.Identity();

        HasMany(x => x.AB)
            .KeyColumn("BId")
            .Cascade.All();
    }
}

public class ABMap : ClassMap<AB>
{
    public ABMap()
    {
        Table("AB");

        SchemaAction.None();

        Id(x => x.ABId)
            .GeneratedBy.Identity();

        Map(x => x.CustomProperty)
            .Not.Nullable();

        References(x => x.A)
            .Column("AId");

        References(x => x.B)
            .Column("BId")
            .Cascade.None();
    }
}

代码:

_session.BeginTransaction();

var a = _session.Get<A>(1);

foreach (var ab in a.AB) {
    _session.Delete(ab);                 
}

_session.Delete(a);

transaction.Commit();

我想删除 A 表格中的记录以及 AB 表格中的所有关联记录。

最简单的解决方案是在 AB 可以为空的中设置 AId BId ,但我认为有一个更好的解决方案,它可以在映射中解决。

提前谢谢你:)

1 个答案:

答案 0 :(得分:0)

试试这个:

HasMany(x => x.AB)
    .KeyColumn("BId")
    .Cascade.All()
    .Inverse();