我有两个相互引用的对象。从纯粹的模式角度来看,对象一可以有多个引用它的对象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
对我来说,但这不会发生。我必须在两个方向上手动更新。有什么方法可以避免这种情况吗?
答案 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检测到后向引用。 (正如文章中的例子所示)。