【问题标题】:Nhibernate not inserting parentid into childNhibernate没有将parentid插入孩子
【发布时间】:2015-03-29 19:20:03
【问题描述】:

我手头有一个奇怪的问题。首先看看我的表架构。

A(身份证) B(身份证,援助) C(身份证,援助) D(ID,CID)

地图文件如下:

MAP A
{
HasMany(x => x.B).Cascade.AllDeleteOrphan().Inverse().KeyColumn("AID");
HasMany(x => x.C).Cascade.AllDeleteOrphan().Inverse().KeyColumn("AID");
}

MAP B
{
References(x => x.A).Column("AID");
}

MAP C
{
References(x => x.A).Column("AID");
HasMany(x => x.D).Cascade.AllDeleteOrphan().Inverse().KeyColumn("BID");
}

MAP D
{
References(x => x.C).Column("CID");
}

在 A 上执行 SaveORUpdate/Merge 时,它​​不会将 AID 插入 B 和 C。但它会将 CID 插入 D。任何建议。

【问题讨论】:

    标签: c# nhibernate oracle11g fluent


    【解决方案1】:

    如果发生这种情况,您肯定错过了分配关系的双方。如果这将到位:

    var parent = ...;
    var child = ...;
    parent.Children.Add(child);
    child.Parent = parent;
    

    一切都会奏效。因为这里最被怀疑的是你的代码是这样的:

    var parent = ...;
    var child = ...;
    parent.Children.Add(child);
    // child.Parent = parent; // this is missing
    

    这不会插入孩子。为什么?

    因为我们使用了 .Inverse() 映射。这是一个非常强大但脆弱的设置。它允许 NHibernate 进行一些重要的优化,但这需要 - 必须在子级中设置父级

    查看这篇不错的文章

    Inverse = “true” example and explanation by mykong

    【讨论】:

    • 我已经正确添加了关系。如示例中所示,还设置了 inverse。
    • 唯一可以看到的是您问题中的 inverse。这就是为什么我解释发生了什么。因为没有代码你如何分配孩子和父母...... NHibernate 简单地知道:反向已经到位。我会把这部分留给每个孩子。如果孩子没有正确设置......什么都不会发生。好消息是父级上的级联仍然足以让我们只说 session.Save(parent)... (也只是一个注意,对于任何有更多真实姓名的人来说,您的问题将比 ABCD 更具可读性)
    • 流利地说我们可以说 Inverse() 并且它有效。我也做了 B.A = A C.A = A 和 D.C = C 之后我保存了 A.
    • 糟糕,问题出现了。这是自动映射器问题,与 Nhibernate 完全无关。坏坏我。
    • ;) 现在说得通了 ;) NHibernate 是可能的工具 ;) 享受吧,先生 ;)
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多