【问题标题】:NHibernate reference back - hasmany and reference to the same entityNHibernate 引用返回 - hasmany 和对同一实体的引用
【发布时间】:2011-07-30 19:10:53
【问题描述】:

我对这样的情况有疑问:

public class Foo
{
    public Foo()
    {
        Bars = new List<Bar>();
        AddBar(new Bar(this));
    }

    public IList<Bar> Bars {get;private set;}

    public Bar LastBar {get;private set;}

    public void AddBar(Bar bar)
    {
        Bars.Add(bar);
        LastBar = bar;
    }
}

public class Bar
{
    public Bar(Foo foo)
    {
        BelongsToFoo = foo;
    }

    public Foo BelongsToFoo {get;private set;}

    //...
}

当我这样做时:

var f = new Foo();
Repository.Save<Foo>(f); // -> exception - BelongsToFoo is null

当我删除更新 LastBar

LastBar = bar;

并设置为可空一切正常,但 LastBar 为空,当然。我想正确分配和保存最后一个 Bar。

我应该如何正确映射这些实体?

编辑 1
这仅在创建新对象时发生。当我更新 Foo 并添加新栏时,一切正常。

【问题讨论】:

    标签: nhibernate fluent-nhibernate reference mapping


    【解决方案1】:

    确保将列表和多对一引用映射到同一列并使列表反向。

    从 BelongsToFoo 属性中移除非空约束。 NH 有时需要存储一条带有空引用的记录,并在稍后获得引用对象的标识时对其进行更新。使用身份生成器时,这种情况发生得更频繁。

    【讨论】:

    • 不幸的是,我正在这样做。 :(
    • 我一直在使用 HiLo,并且对 BelongsToFoo 属性没有非空约束。 :(
    【解决方案2】:

    我找到了我的问题和解决方案。

    我使用http://nhforge.org/blogs/nhibernate/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx 跟踪上次日期和用户更改信息。

    就我而言,NHibernate 需要这样做:

    1. 插入 Foo
    2. 插入栏
    3. 更新 Foo.LastBar(外键)

    在.1。 NHibernate 调用 OnPreInsert 但 at.3。在同一实体上调用 OnPreUpdate,但持久化有关 CreatedAt、CreatedBy 属性的松散信息。

    我更改了 OnPreUpdate 以从实体对象中显式复制这两个值。

    PS
    我知道异常很奇怪,不适合这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多