【问题标题】:Circular Reference, NHibernate and WCF循环引用、NHibernate 和 WCF
【发布时间】:2010-12-06 08:38:42
【问题描述】:

这个问题多年来一直在网络上流行,我还没有找到好的解决方案。 该主题正在传递一个对象列表,其中包含由 NHibernate 填充的循环引用(有或没有延迟加载 - 有些网站说它不能用延迟完成)

示例如下:

[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>();

我在服务器端得到了一个很好的结果——一个所有人的列表,在每个人里面我得到一个所有儿子的列表(在每个儿子里面——我得到一个 Person 的对象,里面有一个 List他的儿子等....)

现在,尝试通过 WCF 获取此列表会使通道出错。 (如果我从孩子身上移除 Person 对象 - 它工作正常)。

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

任何想法如何在不重写 WCF 的情况下解决这个问题?

谢谢, 丹妮

【问题讨论】:

    标签: wcf fluent-nhibernate


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:
      如果您想实际保留对象图的形状,

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

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

      【讨论】:

      • 我已将 IsReference 放在 DataContract 属性上,在链接的文章中,他们说它应该放在有问题的 [DataMember] 但......令人惊讶的是 - [DataMember] 不知道这个标志.此代码将无法编译! (这很奇怪,因为示例的来源是 MSDN...) Systme.RunTime.Serialization DataMemberAttribute 不包含 IsReference=true 的定义.....一个难题。
      • 嗯,是的,没有注意到主题被破坏了......仍然: - 您是否将 IsReference 放在 Child 和 Person 类型上? - 当您尝试 IsReference 时究竟发生了什么? (例外情况等?)
      • 同样的例外 - 没有任何改变。例外是普遍的,没有具体的。我读过一篇建议转移到另一个序列化程序的文章。我正在检查这个选项,我会在这里报告。我已经向某人@Microsoft 询问了这篇文章,仍在等待答复。
      【解决方案3】:

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

      【讨论】:

      • WCF 的默认大小为 512K。我只有 5 个“Person”对象,其中只有 1 个有儿子​​。这可能是大小问题 - 由于序列化的无限循环,但原始结构不超过几个 K....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      相关资源
      最近更新 更多