这个问题在网络上流行多年,我还没有找到好的解决方案。 主题是传递一个对象列表,其中包含由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-所有人的列表中得到了很好的结果,在每个人里面我得到了所有儿子的列表(并且在每个儿子里面 - 我得到一个Person的对象,里面有一个List的他的儿子等......)
现在,尝试通过WCF获取此列表会使通道出现故障。 (如果我从子项中删除Person对象 - 它工作正常)。
解决方案我尝试过但没有解决这个问题: 将IsReference = true添加到[DataContract] - 没有帮助。 将所有映射移动到not.Lazyload() - 没有帮助。
任何想法如何在不重写WCF的情况下解决这个问题?
谢谢, 达尼
答案 0 :(得分:2)
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
答案 1 :(得分:0)
看起来您的问题是响应的大小。 WCF具有要发送的消息大小的配置。当您包含超出限制的子对象时。
答案 2 :(得分:0)
IsReference 确实是官方的答案。见http://msdn.microsoft.com/en-us/library/cc656708.aspx。 当你说“它没有帮助”时,你能详细说明你的意思吗?你究竟在哪里放了IsReference?在客户端和服务器端?你观察到了什么错误?
如果您不关心ref保存,有各种解决方案涉及打破无限参考周期。最简单的方法是从“父”中删除DataMember属性。或者具有“影子属性”的东西:
public Person Father;
[DataMember] public string FatherName
{ get {return Father.Name;} set {/* ... */ }}
这在很大程度上取决于您的确切要求......