2009-12-04 51 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