流畅的nhibernate环形参考疼痛



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

最新更新