停止延迟加载或跳过在NHibernate中加载属性?代理无法通过WCF序列化

Hel*_*Sam 9 c# nhibernate wcf lazy-loading

考虑我有父,子关系类和映射.我正在使用NHibernate从数据库中读取对象,并打算使用WCF通过线路发送对象.

目标

  • 为了读取父对象,我想有选择地在不同的执行路径上决定何时加载子对象.因为我不想阅读超过我需要的东西.
  • 那些部分加载的对象必须能够通过WCF发送.当我的意思是我没有加载它,双方都不会访问这样的属性.

问题

  • 当通过WCF发送这样的部分加载的对象时,由于这些属性被标记为[DataContract],它不能被序列化,因为属性是延迟加载代理而不是真正的已知类型.

我想要存档的内容,或者我能想到的解决方案

  • lazy=falselazy=true不起作用.前者将急切地获取所有关系,后者将创建一个代理.但我不想要任何东西 - 一个null是最好的.
  • 我不需要延迟加载.我希望得到一个null我不想获取的引用.null,但不仅仅是代理.这将使WCF满意,并浪费更少的时间来构建延迟加载代理.
    我可以拥有一个null代理工厂吗?
    -要么-
  • 或者让WCF忽略那些代理而不是真实的属性.我尝试了IDataContractSurrogate解决方案,但只传递了父级GetObjectToSerialize,我从未观察到代理被传递GetObjectToSerialize,没有机会取消代理它.

编辑

阅读评论后,更多在网上冲浪......

在我看来,DTO会将计算的主要部分转移到服务器端.但对于我正在开发的项目,50%的时间客户端比服务器"更智能",服务器更像是一个带有验证和验证的数据存储.虽然我同意服务器不是很愚蠢 - 我必须决定何时获取额外的引用,而DTO将使这一点非常明确.

也许我应该忍受痛苦.之前我不知道http://automapper.codeplex.com/,这激励我多一点痛苦.

另一方面,我发现http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/,这似乎与IDataContractSurrogate.GetObjectToSerialize.

小智 1

我遇到了类似的性能问题,我所做的是通过使用 DetachedCriteria 显式调用数据库来预加载我想要的信息

与你正在做的事情非常相似,我可能会做这样的事情。

public DetachedCriteria BuildMyCriteria()
{
    var criteria = DetachedCriteria.For<ParentClass>();
    criteria.CreateCriteria("this.ChildClass", "Child Class").SetFetchMode("this.ChildClass", FetchMode.Eager);
    criteria.Add(Restrictions.IsNotNull("ChildClass.Property");      

    return criteria;
}
Run Code Online (Sandbox Code Playgroud)

然后从我的外观中,我将获取那些具有子属性上没有空属性的属性的实体

var myClasses = _repository.ExecuteDetachedCriteria<ParentClass>(BuildMyCriteria);
Run Code Online (Sandbox Code Playgroud)

然后我将拥有所有具有 null 属性的 ParentClass 实体。

因此,我不会不断向数据库询问信息,而是将其存储在内存中,以便我可以使用。

这只是 DTO 的替代解决方案,祝你好运:)