nhibernate 3.3一对多映射代码更新子代而不是插入
我有这种一对多的关联,我用“老”nhibernate或流利创造了zilions次。 但我无法使用代码映射
这些是课程
public class Parent { public virtual IList Children { get; set; } } public class Child { public virtual Parent Parent { get; set; } }
没什么奇怪的
这些是映射类
对于家长:
Bag(x => x.Parent, m => m.Key(k => k.Column("Parent_id")));
儿童:
ManyToOne(x => x.Children, map => { map.Column("Parent_id"); map.Cascade(Cascade.All); });
如果我做以下事情
var parent = new Parent(); parent.Children.Add(new Child()); session.SaveOrUpdate(parent);
我为父母提供了正确的INSERT,但它为任何添加的孩子进行了更新
UPDATE TableChildren ...... WHERE Id = 0 <-????
我错过了什么? 我在敲我的头!
我看到两个问题。 映射似乎是倒置的( Bag
应该用于Children
, ManyToOne
用于Parent
)。 这里的基本设置也是inverse="true"
。
正如此处详细记录:
- 按代码映射 – 设置和包 ,我们应该添加:
- 按代码映射 – ManyToOne
儿童应该像这样映射:
Bag(x => x.Children, m => m.Inverse(true); m.Cascade(Cascade.All); m.Key(k => k.Column("Parent_id")));
和父母一样
ManyToOne(x => x.Parent, map => { map.Column("Parent_id"); });
inverse="true"
是指导NHibernate的一种方式,每个孩子都可以自我管理。 因此,一旦将孩子添加到Children
系列中,我们还必须设置其Parent
! 然后NHibernate将在一步中使用正确的引用INSERT子进程。