我的域A和域B中有两个对象
对象A具有B的属性对象B具有列表的属性
当我点击我的数据库B时,它会返回一个As列表,但每个a都有一个B,而B又有一个As的列表。一遍又一遍。
显然是一个懒惰的加载问题。懒惰加载正在进行,但我的问题是这是一个WCF服务,我是否需要将所有域对象转换为dto对象来发送,当我这样做时,它会执行以下操作-伪代码
ADTO adto Transform(ADomain a)
{
adto.name = a.name;
adto.surname = a.surname;
adto.B = Transform(a.B);
}
BDTO bdto Transform(BDomain b)
{
bdto.bob = b.bob;
foreach (A a in b.As)
{
bdto.bs.add(Transform(a));
}
}
那么,我如何才能让我的收藏只深入一层呢。
B的映射:
HasMany(x => x.As)
.Cascade.AllDeleteOrphan()
.Fetch.Select()
.Inverse().KeyColumn("AId");
A的映射:
References(x => x.B).Column("AId");
好吧,要在WCF上传递循环引用,您应该使用IsReference
参数DataContractAttribute.IsReference属性来调整父DTO(B)(或此处为循环引用问题)。
使用IsReference属性指示DataContractSerializer插入保留对象引用信息的XML构造。
[DataContract(Namespace = "http://domain.../", IsReference=true)]
公共类BDTO。。。
给你答案:
那么,我如何才能让我的收藏只深入一层呢。
NHibernate不会对循环引用有任何问题。更重要的是,只需执行2个SQL查询,就可以轻松地获取所有数据。调整映射:
HasMany(x => x.As)
.Cascade.AllDeleteOrphan()
.BatchSize(25)
//.Not.LazyLoad()
.Inverse()
.KeyColumn("AId");
注意:只有当A对象几乎总是需要让B工作时,Not.LazyLoad才有意义。当使用"懒惰"模式时,您必须在整个WCF服务处理过程中保持会话打开
BatchSize设置将优化B对象的加载列表。点击此处阅读更多信息:http://ayende.com/blog/3943/nhibernate-mapping-set
NHibernate会话将执行两个查询1)Select B
和2)Select A for all B
,并将结果具体化为完整的A和B实例,两种方式的引用都已完全填充。NHibernate会话将为您提供满载的实例。即使调用Get<A>(id)
和Get<B>(id)
也会从会话中检索对象
接下来的步骤由您决定,您可以使用DTO对象、映射工具来转换它们。。。