2013-02-08 71 views
3

我有我的域名A 2点的对象,和B功能NHibernate循环引用疼痛

对象A具有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"); 
+0

的可能重复[循环引用,NHibernate和WCF] (http://stackoverflow.com/questions/1560846/circular-reference-nhibernate-and-wcf) – Peter 2013-02-08 13:22:42

回答

1

好了,通过循环引用了WCF你应该IsReference参数DataContractAttribute.IsReference Property(或在此The Problem of Circular References调整父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"); 

注:Not.LazyLoad意义只有在几乎总是需要一个对象来获得工作b。当使用“懒惰”模式时,必须在整个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对象,映射工具,将它们转换...