2011-11-17 19 views
3

假设有NHibernate的实体“学校”与引用类型“人”的单个实体“经理”属性。WCF序列化和NHibernate代理为一个单一的实体参考

要 “WCF准备”,人是装饰有DataContractAtrribute。 School.Manager的Fluent NH映射是References(s => s.Manager)。 当型“学校”的实体由WCF发送到客户端,我得到以下消息的异常:

“类型‘Castle.Proxies.PersonProxy’不能是ISerializable的和具有DataContractAttribute属性”

现在

,引用一个单一的实体时(而不是通过集合)这只是发生。 我的解决方法是通过添加.Not.LazyLoad()References子句来禁止代理。

有没有人遇到这个问题,或者有任何想法如何解决呢?

感谢, 埃拉德

回答

3

当您选择不加载引用实体热切,NHibernate的将创建动态代理(使对象可以在将来的某个时候初始化)。这是标准的行为。

现在,对于对象列表,NHibernate将使用其代理集合之一(例如PersistentGenericBag)。由于集合类型是已知的,它可以被序列化。当它接近你的实体类时会发生什么?它将根据您的类型生成动态代理,该类型将不可序列化(这归功于面向运行时/动态特性)。

这是建立在机制,我不认为你可以做很多事情。然而,有两种解决这个问题:使用Not.LazyLoad()像你现在这样

  • ,迫使实例创建
  • 或者,您也可以通过Web服务发送之前设置Managernull。无论如何,你不会在客户端使用任何代理(因为会话将会很久)。
2

扩展jimmy_keen的回答,还有一些其他的选择

  • 设置fetchmode跃跃欲试的参考,当串行化之前加载
  • 复制的domainObject到DTO- /消息对象,以通过网络发送(很好的做法,有更多的控制,怎样越过线)
  • 实施IDataContractSurrogate看到here
相关问题