2014-02-12 40 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進行比較;) –

相關問題