Hel*_*Sam 9 c# nhibernate wcf lazy-loading
考虑我有父,子关系类和映射.我正在使用NHibernate从数据库中读取对象,并打算使用WCF通过线路发送对象.
[DataContract],它不能被序列化,因为属性是延迟加载代理而不是真正的已知类型.lazy=false或lazy=true不起作用.前者将急切地获取所有关系,后者将创建一个代理.但我不想要任何东西 - 一个null是最好的.null我不想获取的引用.null,但不仅仅是代理.这将使WCF满意,并浪费更少的时间来构建延迟加载代理.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 的替代解决方案,祝你好运:)