循环引用,NHibernate和WCF

时间:2009-10-13 15:07:27

标签: wcf fluent-nhibernate

这个问题在网络上流行多年,我还没有找到好的解决方案。 主题是传递一个对象列表,其中包含由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的情况下解决这个问题?

谢谢, 达尼

3 个答案:

答案 0 :(得分:2)

答案 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 {/* ... */ }}   

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