2009-12-04 50 views
0

我有兩個引用對方的對象。從純粹的模式角度來看,對象可以有多個引用它的對象2的實例,但業務邏輯指定對象2的每個實例將引用對象1的唯一實例,反之亦然。nhibernate - 循環引用不更新

例子:

public class Object1 { 
    public Guid Id {get;set;} 
    public Object2 Object2 {get;set;} 

    public Object1ClassMap : ClassMap<Object1> 
    { 
     // ... 
     References<Object2>(x=>x.Object2) 
      .Column("Object2Id") 
      .Cascade.SaveUpdate() 
      .Not.LazyLoad(); 
    } 
} 

public class Object2 { 
    public Guid Id {get;set;} 
    public Object1 Object2 {get;set;} 

    public Object2ClassMap : ClassMap<Object1> 
    { 
     // ... 
     References<Object1>(x=>x.Object1) 
      .Column("Object1Id") 
      .Cascade.SaveUpdate() 
      .Not.LazyLoad(); 
    } 
} 

當我做到以下幾點:

instanceOfObject1.Object2 = instanceOfObject2 

我期望NHibernate的檢測後引用和自動爲我做

instanceOfObject2.Object1 = instanceOfObject1 

,但這不會發生。我必須在兩個方向上手動更新。任何方式來避免這種情況?

回答

0

您需要根據POCO對象而不是數據庫關係來考慮它。 obj1和obj2之間的關係並不呈現相反的關係。要建立強大的雙向關係,您必須手動設置關係。您可能會發現更容易地編寫幾集函數,做這樣的事情:

public class Object1(){ 
    public Object2 Object2 { get; internal set; } 

    public void SetObject2(Object2 obj2){ 
    Object2 = obj2; 
    obj2.Object1 = this; 
    } 
} 

public class Object2(){ 
    public Object1 Object1 { get; internal set; } 

    public void SetObject1(Object1 obj1){ 
    obj1.SetObject2(this); 
    } 
} 
0

從你的描述,你需要你的對象之間的一個一對一的關係。我無法解釋它比這更好的文章呢:

http://ayende.com/Blog/archive/2009/04/19/nhibernate-mapping-ltone-to-onegt.aspx

文章使用XML映射,但我相信,你將能夠輕鬆地把它翻譯成流利的方式。

閱讀,因爲它可能會給你你要找的答案。

在任何情況下,你應該期望NHibernate在將兩個對象保存到NHibernate會話中之後檢測返回引用。 (正如文章中的例子)。

+0

我試過一對一的,但顯然這隻有在兩個人共享一個主鍵時纔有效,但這些都不會。 – Chris 2009-12-04 13:44:46