2012-11-08 40 views
0

我有一個一對多沒有保存關係

<class name="ReportRow"> 
    <bag name="Marks" cascade="save-update" inverse="true"> 
     <key column="ReportRowId"/> 
     <one-to-many class="Mark"/> 
    </bag> 
</class> 

// C# code 
public virtual IList<Mark> Marks { get; set; } 

一個ReportRow(父)和馬克(子)之間的關係,但它沒有被保存(在標記表,ReportRowId總是空值)。

我知道這些關係始終是雙向的,因爲NHibernate的「怪癖」,所以我的馬克I類有:

<many-to-one name="ReportRow" class="ReportRow" column="ReportRowId" /> 

// C# 
public virtual ReportRow ReportRow { get; set; } 

我甚至有這種關係的其他地方工作的其他一些例子在我的項目中,但這一個是行不通的,我看不到任何區別...

... Mark和ReportRow都有子類(例如ModuleMark和ModuleReportRow),我正在使用實現繼承的聯合子類策略。

會有什麼關係嗎?對於關係的兩端,映射都是在父類映射中定義的,而不是嵌套在映射中。

感謝

+0

哦,它的工作原理,如果我先救行(所以它有一個ID - session.Save(myRow)),然後將行添加到標記(mark.Row = myrow)並保存標記(session.Save(標記)),然後將該標記添加到該行的集合(row.Marks.Add(mark)),然後保存該行(再次)。似乎有點複雜,但我做對了嗎? – Richard

+0

有這一行的文檔:「與逆關聯映射一端=」 true「不會影響級聯操作,二者是不同的概念!」從這裏:http://nhforge.org/doc/nh/en/index.html#collections-bidirectional。我不應該期望級聯在這種情況下出於某種原因工作嗎?我不明白爲什麼。 – Richard

+0

對不起,正確的順序是:保存行,將行添加到標記,保存標記。這比我在第一條評論中所說的要簡單。仍然不明白爲什麼我不能走另一條路,只是將它從行中逐漸降格到標記。 – Richard

回答

0

你是如何添加標記到集合?因爲集合是關係的反面,所以在將其添加到集合時,您需要在子集上設置對父對象的引用。一種常見的方法是使用方法在父對象來維護關係,例如:

public void AddMark(Mark mark) 
    { 
     mark.ReportRow = this; 
     Marks.Add(mark); // better yet map the collection as a private field 
    } 

我認爲,「逆」爲「誰穿了褲子在這種關係中。」

+0

謝謝傑米,我沒有想過這樣做,但我想我會。和褲子+1評論,我喜歡(記住它的好方法!):) – Richard

相關問題