[英]Stop lazy loading or skip loading a property in NHibernate? Proxy cannot be serialized through WCF
考虑我有父,子关系类和映射。 我正在使用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
。
WCF-Silverlight转移DTO / Entities时遇到了同样的问题。 我使用以下代码工作正常:
流利的NHibernate:
References(c => c.DataSource)
.Column("DataSourceId")
.Cascade.None()
.Not.LazyLoad();
HasManyToMany(c => c.Categories)
.Table("Categories")
.ParentKeyColumn("ItemId")
.ChildKeyColumn("CategoryId")
.Not.LazyLoad()
.Cascade.None()
.Inverse();
XML:
<many-to-one name="DataSource" column="DataSourceId" lazy="false" cascade="none" />
希望这对你有用!
我遇到了与性能类似的问题,我所做的是通过使用DetachedCriteria对DB进行显式调用来预加载我想要的信息。
与你正在做的事情类似,我可能会做这样的事情。
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;
}
然后从我的外观,我会得到那些具有属性的实体,这些属性在子属性上没有null属性
var myClasses = _repository.ExecuteDetachedCriteria<ParentClass>(BuildMyCriteria);
然后我将拥有所有具有null属性的ParentClass实体。
因此,不是通过不断询问数据库获取信息,而是将其存储在内存中,以便我可以使用它。
这只是DTO的替代解决方案,祝你好运:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.