Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环参考,NHibernate和WCF_Wcf_Fluent Nhibernate - Fatal编程技术网

循环参考,NHibernate和WCF

循环参考,NHibernate和WCF,wcf,fluent-nhibernate,Wcf,Fluent Nhibernate,这个问题在网络上流行了很多年,我还没有找到好的解决方案。 本主题将传递一个对象列表,其中包含由NHibernate填充的循环引用(有或没有惰性加载-一些网站说,惰性加载无法完成) 以下是一个例子: [DataContract] class Person { [DataMemeber] string Name [DateMember] IList<Child> myChilds; } [DataContract] class Child { [Dat

这个问题在网络上流行了很多年,我还没有找到好的解决方案。 本主题将传递一个对象列表,其中包含由NHibernate填充的循环引用(有或没有惰性加载-一些网站说,惰性加载无法完成)

以下是一个例子:

[DataContract]
class Person
{
   [DataMemeber]
   string Name
   [DateMember]
   IList<Child> myChilds;  
}

[DataContract]
class Child
{
   [DataMemeber]
   string Name
   [DateMember]
   Person Father   
}
[DataContract]
班主任
{
[DataMemeber]
字符串名
[日期成员]
IList myChilds;
}
[数据合同]
班童
{
[DataMemeber]
字符串名
[日期成员]
人父
}
当我尝试获取数据库中的所有人员时: 服务器代码将为:

ICriteria crit = session.CreateCriteria(typeof(Person)));
IList<Base> queryResult = crit.List<Base>();
ICriteria crit=session.CreateCriteria(typeof(Person)); IList queryResult=crit.List(); 我在服务器端得到了一个很好的结果——一个所有人的列表,在每个人里面我得到一个所有儿子的列表(在每个儿子里面我得到一个人物的对象,里面有他的儿子的列表等等)

现在,试图通过WCF获得此列表会导致通道故障。 (如果我将Person对象从孩子身上移除,效果很好)

解决方案我尝试过但没有解决此问题: 将IsReference=true添加到[DataContract]-没有帮助。 将所有映射移动到not.Lazyload()-没有帮助

有没有办法在不重写WCF的情况下解决这个问题

谢谢,
Dani

看来您的问题在于响应的大小。WCF对要发送的消息的大小进行了配置。当您包含子对象时,您将超过限制。

如果您想要实际保留对象图形的形状,这里的官方答案确实是引用。看你能详细解释一下你说“这没用”的意思吗?你到底把参考放在哪里了?在客户端和服务器端?你发现了什么错误

如果您不关心ref保存,那么有各种各样的解决方案涉及到打破无限引用循环。最简单的方法是从“父”中删除DataMember属性。或具有“影子属性”的东西:

这在很大程度上取决于你的确切要求

本文解决了这个问题

编辑:


林克显然已经死了一段时间了。使用Wayback机器在此处查看其存档版本:

WCF的默认大小为512K。我只有5个“Person”对象,其中只有1个有一个儿子。这可能是一个大小问题-由于序列化的无限循环,但原始结构不超过几个K…。我将IsReference放在DataContract属性上,在链接的文章中,他们说应该放在有问题的[DataMember]上,但是。。。令人惊讶的是,[DataMember]不知道这个标志。这段代码不会编译!!(非常奇怪的是,示例的来源是MSDN…)Systme.RunTime.Serialization DataMemberAttribute不包含IsReference=true的定义。。。。。一个谜题。嗯,是的,没有注意到主题被打破了。。。仍然:-您是否在儿童和个人类型上都添加了IsReference当你尝试IsReference时到底发生了什么?(例外情况等?)相同的例外情况-没有任何变化。例外情况是一般性的,没有具体的。我读过一篇文章,建议转到另一个序列化程序。我正在检查这个选项,我会在这里报告。关于这篇文章,我已经询问了@Microsoft的某个人,还在等待回答。
public Person Father;
[DataMember] public string FatherName
{ get {return Father.Name;} set {/* ... */ }}