Wcf 环状参考痛

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

我的域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.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对象、映射工具来转换它们

可能重复的