nhibernate 3.3一对多映射代码更新子代而不是插入

时间:2014-02-12 08:05:39

标签: c# nhibernate

我有这种一对多的关联,我用“老”nhibernate或流利创造了zilions次数。但我无法使用代码映射

这些是

 public class Parent
 {
      public virtual IList<Child> 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 <-????

我错过了什么?我在敲我的头!!

1 个答案:

答案 0 :(得分:8)

我看到两个问题。映射似乎已被反转(Bag应该用于ChildrenManyToOne用于Parent。这里的基本设置也是inverse="true"

如此处详细记录:

孩子们应该这样映射:

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将在一步中使用正确的引用来插入子进程。