gpt4 book ai didi

wcf - 流利的 hibernate 循环引用疼痛

转载 作者:行者123 更新时间:2023-12-04 18:20:09 25 4
gpt4 key购买 nike

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

对象A有B的属性对象 B 具有列表属性

当我点击 B 的数据库时,它会返回一个 A 列表,但每个 A 都有一个 B,而 B 又有一个 A 列表。一遍又一遍。

显然是延迟加载问题。延迟加载已打开,但我的问题是这是一个 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 调整父 DTO (B)参数DataContractAttribute.IsReference Property (或此处 The Problem of Circular References)

Use the IsReference property to instruct the DataContractSerializer to insert XML constructs that preserve object reference information. [DataContract(Namespace = "http://domain.../", IsReference=true)] public class BDTO ...

给你答案:

...so how can i make my fetch of the collection only go one layer deep.

NHibernate 不会有循环引用的任何问题。更重要的是,您只需执行 2 个 SQL 查询即可轻松获取所有数据。调整映射:

HasMany(x => x.As)
.Cascade.AllDeleteOrphan()
.BatchSize(25)
//.Not.LazyLoad()
.Inverse()
.KeyColumn("AId");

注意:仅当 A 对象几乎总是需要 B 工作时,Not.LazyLoad 才有意义。当使用“惰性”模式时,您必须在整个 WCF 服务处理期间保持 session 打开

BatchSize设置将优化 B 对象的加载列表。在这里阅读更多:http://ayende.com/blog/3943/nhibernate-mapping-set

NHibernate session 将执行两个查询 1) Select B和 2) Select A for all B并将结果具体化为完整的 A 和 B 实例,并完全填充双向引用。 NHibernate session 将为您提供完全加载的实例。偶来电Get<A>(id)Get<B>(id)将从 session 中检索对象

接下来的步骤由您决定,您可以使用 DTO 对象、映射工具来转换它们...

关于wcf - 流利的 hibernate 循环引用疼痛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com