2009-10-13 88 views
2

這個問題在網絡上流傳多年,我還沒有找到好的解決方案。 主題是通過具有循環引用在其內部通過的NHibernate填充對象列表(具有或沒有遲緩裝載 - 一些網站最高審計機關它不能與懶惰來完成)循環參考,NHibernate和WCF

這裏是例如:

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

[DataContract] 
class Child 
{ 
    [DataMemeber] 
    string Name 
    [DateMember] 
    Person Father 
} 

當我試圖讓所有的人在我的DB: 服務器代碼將是:

ICriteria crit = session.CreateCriteria(typeof(Person))); 
IList<Base> queryResult = crit.List<Base>(); 

我獲取服務器的好成績副作用所有的人的名單,而每個人內我得到一個所有兒子的名單(並在每個兒子裏面 - 我得到一個人的對象,裏面有一個他的兒子列表等....)

現在,試圖通過WCF獲取此列表錯誤的通道。 (如果我從孩子中刪除Person對象 - 它工作正常)。

解決方案我試過並沒有解決這個問題: IsReference = true加入[DataContract] - 沒有幫助。 將所有映射移動到not.Lazyload() - 沒有幫助。

任何想法如何解決這個問題,而不重寫WCF?

感謝, 達尼

回答

2
+0

鏈接現在被打破。 – Restuta 2011-02-02 12:53:28

+0

鏈接仍然消失 - 404。 – ssmith 2011-04-08 16:09:17

0

它看起來像你的問題是響應的大小。 WCF具有要發送的消息大小的配置。當你包含子對象時,你將超出限制。

+0

WCF的默認大小爲512K。 我只有5個「Person」對象,其中只有1個有一個兒子。 這可能是一個尺寸問題 - 由於無限循環的序列化,但最初的結構,只不過是幾個K的.... – Dani 2009-10-13 16:02:44

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

這實際上在很大程度上取決於您的具體要求...

+0

我已經把DataRetract屬性上的IsReference, 在鏈接的文章中,他們說它應該在有問題的[DataMember]上,但是......令人驚訝的是 - [DataMember]不知道這個標誌。這段代碼不會編譯! (這是非常奇怪的例子來源是MSDN ...) Systme.RunTime.Serialization DataMemberAttribute不包含IsReference = true的定義.....一個謎題。 – Dani 2009-10-14 08:19:55

+0

嗯,是的,沒有注意到這個話題被打破了... 仍然: - 你把兒童和人類的IsReference類型? - 當您嘗試IsReference時發生了什麼? (例外等?) – 2009-10-14 16:02:49

+0

同樣例外 - 沒有任何變化。 例外是一般的,沒有特定的。 我讀過一篇文章,建議轉移到另一個序列化程序。我正在檢查這個選項,我會在這裏報告。我已經向某人@微軟詢問了這篇文章,但仍在等待答案。 – Dani 2009-10-14 19:17:33