我手边有一个奇怪的问题。首先看一下我的表模式。
A(ID) B(ID,AID) C(ID,AID) 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.任何建议。
答案 0 :(得分:0)
如果发生这种情况,您肯定错过了分配关系的双方。如果这样的话:
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做一些重要的优化,但这需要 - PARENT必须在子中设置。
查看这篇精彩的文章
mykong