2010-10-25 70 views
4

我有一個數據庫與TablesSilverlight客戶端之間的很多關係連接到我的服務器與WCF serviceASP.Net方。我的數據庫的對象(假設爲GetFoo())返回List<Foo>Foo與其他對象有很多關係,每個對象都有很多重複的關係(這意味着表格之間有一個PK和FK)。我還使用Microsoft Service Trace Viewr跟蹤我的服務WCF無法序列化循環引用

當我調用GetFoo( ),WCF返回此錯誤:

Object graph for type 'X.Y.Z' contains cycles and cannot be serialized if reference tracking is disabled

我搜索這個錯誤,發現this great post但不能正常工作,我看到同樣的錯誤了。

回答

5

各種選項:

  • 移除模型中的循環依賴;這個可能對於一個生成的模型來說比較棘手,該模型有很多針對它的現有代碼,但值得一試嘗試;但是,您通常想不序列化,而這正是LINQ到SQL 希望你保持什麼(它會讓你放下孩子屬性,但是這是你平時想什麼以序列化)
  • 啓用循環引用;看起來你已經嘗試過,但沒有成功;但是你是否在兩端啓用了?其實我不會感到驚訝,如果Silverlight不喜歡這個擴展名(它具有有限的擴展支持)
  • 使用單獨的(平面)DTO模型進行數據傳輸
  • 嘗試使用NetDataContractSerializer;我不記得Silverlight是否支持這個功能,我必須承認我不是它最大的粉絲,但它可能是一個務實的修復方法

我會在「DTO模型」類別中堅決投票;簡單地說,擁有一個單獨的模型意味着當你調整數據庫時,你不太可能陷入糾結 - 而且你完全控制它。

+0

@Marc Gravell:我無法刪除循環依賴關係,它很多!有任何代碼來檢測它?如果我想使用DTO,我必須創建並實現200多個對象,並且我有截止日期! – 2010-10-25 07:18:50

+0

@Marc Gravell:啓用循環引用?如何做到底? – 2010-10-25 07:22:47

+0

@Meysam - 就像你鏈接到的博客文章一樣;但它需要應用於客戶端和服務器。我沒有在silverlight中試過,所以我不能評論它是否可能。 – 2010-10-25 07:23:43

2

有點遲了。但是如果有人正在使用linqtosql並且遇到這個問題,你可以簡單地在你的dbml類中打開這些表。右鍵單擊表格並單擊屬性。 這裏有一個名爲序列化模式屬性..它設置爲單向

錯誤將會消失

1

我知道這是一個老問題了,但你嘗試裝飾與您DBML生成的類[ DataContract(IsReference =真)]?

我在2010年遇到了同樣的問題,不得不採取一些相當極端的措施來讓它在客戶端和服務端工作,但最近通過VS2013/.NET4.5返回,並且痛苦少得多,因爲這裏記錄(與EF v6 RC 1 POCO對象):http://sanderstechnology.com/2013/more-with-the-entity-framework-v6-rc1/12423/

相關問題