nhibernate - 循环引用不更新

时间:2009-12-04 08:52:39

标签: nhibernate

我有两个相互引用的对象。从纯粹的模式角度来看,对象一可以有多个引用它的对象2的实例,但业务逻辑指定对象2的每个实例将引用对象一的唯一实例,反之亦然。

示例:

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

对我来说,但这不会发生。我必须在两个方向上手动更新。有什么方法可以避免这种情况吗?

2 个答案:

答案 0 :(得分:0)

您需要根据POCO对象而不是数据库关系来考虑它。 obj1和obj2之间的关系不呈现反比关系。要建立强大的双向关系,您必须手动设置关系。您可能会发现编写几个这样的set函数更容易:

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);
  }
}

答案 1 :(得分:0)

根据您的描述,您需要在对象之间建立一对一的关系。我无法解释它比这篇文章更好:

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

本文使用XML映射,但我相信您可以轻松地将其翻译为Fluent方式。

阅读,因为它可能会给你你寻找的答案。

在任何情况下,在将两个对象保存到NHibernate的会话中之后,您应该期望NHibernate检测到后向引用。 (正如文章中的例子所示)。