这个问题在网络上流行多年,我还没有找到好的解决方案 . 主题是传递一个对象列表,其中包含由NHibernate填充的循环引用(有或没有延迟加载 - 有些站点sais它不能用懒惰完成)
这是一个例子:
[DataContract]
class Person
{
[DataMemeber]
string Name
[DateMember]
IList<Child> myChilds;
}
[DataContract]
class Child
{
[DataMemeber]
string Name
[DateMember]
Person Father
}
当我尝试在我的数据库中获取所有人员时:服务器代码将是:
ICriteria crit = session.CreateCriteria(typeof(Person)));
IList<Base> queryResult = crit.List<Base>();
我在SERVER SIDE-所有人的列表中得到了很好的结果,并且在每个人的内部我得到了所有儿子的列表(并且在每个儿子里面 - 我得到一个人的对象,里面有他的儿子的列表等....)
现在,尝试通过WCF获取此列表会使通道出现故障 . (如果我从子项中删除Person对象 - 它工作正常) .
解决方案我已经尝试过并没有解决这个问题:将IsReference = true添加到[DataContract] - 没有帮助 . 将所有映射移动到not.Lazyload() - 没有帮助 .
任何想法如何解决这个问题而不重写WCF?
谢谢,Dani
3 回答
http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7
本文解决了这个问题 .
编辑:
Link显然已经死了一段时间了 . 使用Wayback Machine在这里查看它的存档版本:http://web.archive.org/web/20070219214621/http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7
看起来您的问题是响应的大小 . WCF具有要发送的消息大小的配置 . 当您包含子对象时,您将超出限制 .
如果你想真正保留对象图的形状, IsReference 确实是这里的官方答案 . 见http://msdn.microsoft.com/en-us/library/cc656708.aspx . Can you elaborate on what you mean when you say "it didn't help"? 你究竟在哪里放IsReference?在客户端和服务器端?你观察到什么错误?
如果您不关心ref保存,有各种解决方案涉及打破无限参考周期 . 最简单的方法是从“父”中删除DataMember属性 . 或者具有“影子属性”的东西:
这真的很大程度上取决于你的确切要求......