NHibernate引用返回 - hasmany和对同一实体的引用

时间:2011-04-06 12:32:13

标签: nhibernate fluent-nhibernate reference mapping

我遇到这样的情况有问题:

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当然是null。我希望正确分配和保存最后一个Bar。

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

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

2 个答案:

答案 0 :(得分:0)

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

从BelongsToFoo属性中删除not-null约束。 NH有时需要存储带有空引用的记录,并在获得引用对象的标识时更新它。使用身份生成器时,这种情况会更频繁发生。

答案 1 :(得分:0)

我发现了我的问题和解决方案。

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

在我看来,NHibernate需要这样做:

  1. 插入Foo
  2. 插入栏
  3. 更新Foo.LastBar(外键)
  4. At.1。 NHibernate调用OnPreInsert但是at.3。在同一实体上调用OnPreUpdate但保留有关CreatedAt,CreatedBy属性的松散信息。

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

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