3

我的域 A 和 B 中有 2 个对象

对象 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");
4

1 回答 1

1

好吧,要通过 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");

注意:Not.LazyLoad 仅在几乎总是需要 A 对象来使 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 对象、映射工具来转换它们...

于 2013-02-09T05:41:09.100 回答