代码之家  ›  专栏  ›  技术社区  ›  Dani

循环参考,NHibernate和WCF

  •  2
  • Dani  · 技术社区  · 15 年前

    本主题将传递一个对象列表,其中包含由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对象从孩子身上移除,效果很好)。

    将IsReference=true添加到[DataContract]-没有帮助。 将所有映射移动到not.Lazyload()-没有帮助。

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

    谢谢 丹尼

    3 回复  |  直到 15 年前
        2
  •  0
  •   Shiraz Bhaiji    15 年前

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

        3
  •  0
  •   Eugene Osovetsky    15 年前

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