Wcf 环状参考痛
我的域A和B中有2个对象 对象A的属性为B 对象B的属性为list 当我点击我的db,of B时,它返回一个As列表,但每个a都有一个B,而B又有一个As列表。一遍又一遍 显然,这是一个延迟加载问题。延迟加载已启用,但我的问题是,这是一个WCF服务,我是否需要将所有域对象转换为dto对象以发送数据,并且在执行此操作时执行以下操作-伪代码Wcf 环状参考痛,wcf,nhibernate,fluent-nhibernate,Wcf,Nhibernate,Fluent Nhibernate,我的域A和B中有2个对象 对象A的属性为B 对象B的属性为list 当我点击我的db,of B时,它返回一个As列表,但每个a都有一个B,而B又有一个As列表。一遍又一遍 显然,这是一个延迟加载问题。延迟加载已启用,但我的问题是,这是一个WCF服务,我是否需要将所有域对象转换为dto对象以发送数据,并且在执行此操作时执行以下操作-伪代码 ADTO adto Transform(ADomain a) { adto.name = a.name; adto.surname = a.surn
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");
References(x => x.B).Column("AId");
A的映射:
HasMany(x => x.As)
.Cascade.AllDeleteOrphan()
.Fetch.Select()
.Inverse().KeyColumn("AId");
References(x => x.B).Column("AId");
那么,要通过WCF传递循环引用,您应该使用
IsReference
参数(或此处)调整父DTO(B)
使用IsReference属性指示DataContractSerializer插入保留对象引用信息的XML构造。
[DataContract(命名空间=”http://domain.../“,IsReference=true)]
公共类BDTO
要给你答案:
…那么我如何才能让我的收藏只深入一层呢
NHibernate不会对循环引用有任何问题。更重要的是,您可以在仅执行2个SQL查询时轻松获取所有数据。调整映射:
HasMany(x => x.As)
.Cascade.AllDeleteOrphan()
.BatchSize(25)
//.Not.LazyLoad()
.Inverse()
.KeyColumn("AId");
注意:不是。只有当A对象几乎总是需要B工作时,LazyLoad才有意义。当使用“惰性”模式时,您必须在整个WCF服务处理过程中保持会话打开
该设置将优化B对象的加载列表。请在此处阅读更多信息:
NHibernate会话将执行两个查询1)选择B
和2)为所有B
选择A,并将结果具体化为完整的A和B实例,同时完全填充两种方式的引用。NHibernate会话将为您提供完全加载的实例。甚至调用Get(id)
和Get(id)
也会从会话中检索对象
接下来的步骤由您决定,您可以使用DTO对象、映射工具来转换它们 可能重复的