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

Ste*_*net 4 c# nhibernate

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

这些是课程

 public class Parent
 {
      public virtual IList<Child> Children { get; set; }
 }

 public class Child
 {
      public virtual Parent Parent { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

没什么奇怪的

这些是映射类

对于家长:

 Bag(x => x.Parent, m => m.Key(k => k.Column("Parent_id")));
Run Code Online (Sandbox Code Playgroud)

儿童:

 ManyToOne(x => x.Children, map => { map.Column("Parent_id"); map.Cascade(Cascade.All); });
Run Code Online (Sandbox Code Playgroud)

如果我做以下事情

 var parent = new Parent();
 parent.Children.Add(new Child());

 session.SaveOrUpdate(parent); 
Run Code Online (Sandbox Code Playgroud)

我为父级提供了正确的INSERT,但它为所添加的任何子级进行了更新

UPDATE TableChildren
......
WHERE Id = 0 <-????
Run Code Online (Sandbox Code Playgroud)

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

Rad*_*ler 9

我看到两个问题.映射似乎倒(Bag应该去Children,ManyToOne一个Parent).这里的基本设置也是inverse="true".

详细记录如下:

儿童应该像这样映射:

Bag(x => x.Children, m => 
    m.Inverse(true);
    m.Cascade(Cascade.All);
    m.Key(k => k.Column("Parent_id")));
Run Code Online (Sandbox Code Playgroud)

和父母一样

ManyToOne(x => x.Parent, map => 
{ 
    map.Column("Parent_id"); 
});
Run Code Online (Sandbox Code Playgroud)

inverse="true"是一种如何指导NHibernate的方式,每个孩子都可以自我管理.所以,一旦孩子被添加到Children集合中,我们也必须设置它Parent!然后NHibernate将在一步中使用正确的引用INSERT子进程.

  • 享受NHibernate,真正令人惊叹的工具;) (2认同)