我遇到这样的情况有问题:
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并添加新栏时,一切正常。
答案 0 :(得分:0)
确保将列表和多对一引用映射到同一列,并使列表反转。
从BelongsToFoo属性中删除not-null约束。 NH有时需要存储带有空引用的记录,并在获得引用对象的标识时更新它。使用身份生成器时,这种情况会更频繁发生。
答案 1 :(得分:0)
我发现了我的问题和解决方案。
我使用http://nhforge.org/blogs/nhibernate/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx来跟踪上次日期和用户更改信息。
在我看来,NHibernate需要这样做:
At.1。 NHibernate调用OnPreInsert但是at.3。在同一实体上调用OnPreUpdate但保留有关CreatedAt,CreatedBy属性的松散信息。
我更改了OnPreUpdate以从实体对象中显式复制这两个值。
PS
我知道异常是奇怪的,并不适合这种情况。