【问题标题】:Fluent NHibernate - many to many with additional table - Cannot insert the value NULL Exception during deletion流利的 NHibernate - 多对多与附加表 - 删除期间无法插入值 NULL 异常
【发布时间】:2017-10-14 06:00:06
【问题描述】:

我与附加表存在多对多关系,当我尝试删除在 AB 表中也有引用的 A 对象时,会出现以下错误:

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

无法将值 NULL 插入到列“AId”中, 表'AB';柱子 不允许空值。更新失败。声明已终止。

我的数据库架构:

我的课:

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 表中的 AIdBId 可为空,但我认为有一个更好的解决方案,它可以在映射中解决。

提前谢谢你:)

【问题讨论】:

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


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 同样的问题:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多