2014-02-12 103 views
3

我有这个一对多的关联,我创建了'老'nhibernate或流利的时代的zilions。但我上无法使其与映射,通过代码nhibernate 3.3一对多映射的代码更新儿童,而不是插入

工作,这些都是类

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 <-???? 

什么是我缺少的所有子更新?我在敲我的头!

回答

6

我看到两个问题。映射似乎是反转的(Bag应该为Children,ManyToOneParent)。这里的基本设置也是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将在一个步骤中用正确的引用插入子进程。

+0

谢谢。首先它是一个错字,我要更新这个问题。对于后者,你是对的,但我徘徊,我从来没有用过这种方式反过来(我使用NHibernate几年以来)。我想我必须使用,如果我想告诉NH我手动管理儿童对象。我徘徊程序设计的工作方式,事实上:D。我要去调查。 –

+2

真的很享受NHibernate,惊人的工具;) –

+1

是的!没有与其他ORM进行比较;) –

相关问题