nhibernate-循环引用未更新

nhibernate-循环引用未更新,nhibernate,Nhibernate,我有两个相互参照的对象。从纯模式的角度来看,对象1可以有多个引用它的对象2的实例,但业务逻辑指定对象2的每个实例将引用对象1的唯一实例,反之亦然 例如: public class Object1 { public Guid Id {get;set;} public Object2 Object2 {get;set;} public Object1ClassMap : ClassMap<Object1> { // ...

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

例如:

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();
    }
}
我希望NHibernate能够检测到反向引用并自动执行

instanceOfObject2.Object1 = instanceOfObject1

对我来说,但这不会发生。我必须在两个方向手动更新。有没有办法避免这种情况?

您需要从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);
  }
}

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

本文使用XML映射,但我相信您将能够轻松地将其转换为流畅的方式

阅读,因为它可能会给你你想要的答案


在任何情况下,您都应该期望NHibernate在将两个对象保存到NHibernate的会话中后检测回引用。正如本文示例中所发生的那样。

我尝试了一对一,但显然,只有当两个共享主键时,这才有效,而这两个都没有。
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);
  }
}