4

我使用的庫(Telerik的)ASP.NET MVC 3如何序列化EF POCO自動生成的對象以避免循環引用?

我已經與這需要通過AJAX返回一些數據的所有functionnalities一個問題:

我使用EF4連接我的數據庫,我已經(並且需要)兩種方式的導航屬性(想象一下,有一些職位的用戶和一個職位有一個用戶)。

的問題是,該庫是使用JavaScriptSerializer,其與編碼JSON數據。

在序列化類型「System.Data.Entity.DynamicProxies.Employee_34048F4F6A98297F826C798A27640C7383E95E8EA8282EC8A5F738FA0C77CBC3」的目的,檢測到我得到

循環引用的錯誤「。

異常,這是對,因爲父母有提到它的孩子,和孩子們參考其父

我已經找到了一些解決辦法,但沒有充分滿足我:

  • 使用數據服務器綁定:不能,則functionnality在阿賈克斯工作(其電網尋呼機,當頁面已滾動到最後它加載下一元素)
  • 使用匿名的對象:不靈活,因爲如果我在數據庫中還有一個字段,則必須將其添加到所有匿名對象中,另外,如果需要我想要的子集合,創建對象此子列表的所有元素。
  • 使用ViewModel:幾乎相同的問題,如果我有一個字段,我必須在所有viewModel上添加這些字段,並且我必須爲我的所有60個視圖創建一個視圖模型,其字段與我的模型完全相同, ...
  • 使用NonSerializedAttribute:我不知道如何把我的T4模板生成我的POCO對象,我不知道它會起作用:有時主對象是孩子,有時候是父母,空關係必須是另一個。

我有幾乎與WCF相同的問題,我創建了一個知道處理循環引用的序列化,我們可以在這裏做同樣的事情嗎?還是有辦法管理這個?

如果不是這樣,我想,最好的辦法就是用「視圖模型」,但有什麼辦法,加快創造者?像一個通用對象,它接受構造函數EF對象並刪除循環引用?還要別的嗎?

非常感謝您

回答

5

事實上,而不是[NonSerialized],它是[ScriptIgnore],你將需要。我會從2的角度接近這一點,雖然:

  1. 使用RegisterConverters和編寫自定義轉換器,指定所有屬性除了父一個(這可能可能太自動化,也許使用雖然定製的類級屬性[SkipSerialize("Parent")]添加在partial class中 - 但這可能過於複雜了)。

  2. 簡單:不要序列的EF POCO,而是使用一個DTO - 這聽起來這是你在你的答案ViewModel是什麼意思。就我個人而言,我不需要擁有一個「實體」(EF/POCO)版本的類和一個非常相似但不同的DTO版本 - 他們的意圖是不同的,並且在我看來它並不違反DRY。

+0

我也支持ViewModel方法。起初,創建實體的副本似乎是多餘的和令人不愉快的。因此,您需要使用不同的序列化屬性或轉換器來嘗試獲得正確的結果,但遇到兩個(或更多)不同視圖需要不同序列化的情況。失敗後,你創建一個ViewModel並使用類似AutoMapper(http://automapper.codeplex.com/)的方法將數據複製到你的實體和視圖模型中,並且突然查看模型是有意義的。 – HackedByChinese 2011-12-14 09:22:31