將實體框架對象序列化為JSON

asp.net-ajax entity-framework json wcf

似乎使用WCF的本機DataContractJsonSerializer或ASP.NET的本機JavaScript序列化程序無法將Entity Framework對象序列化為JSON。這是由於序列化器拒絕的引用計數問題。我也嘗試過Json.NET ,它也沒有專門針對引用計數問題。


編輯: Json.NET現在可以序列化和反序列化實體框架實體


我的對像是實體框架對象,它們被重載以執行其他業務功能(例如,身份驗證等),我不想用平台特定的屬性等來裝飾這些類,因為我想呈現一個與平台無關的API 。

我實際上曾在https://blog.programx.co.uk/2009/03/18/wcf-json-serialization-woes-and-a-solution/上寫過關於我所經歷的各個步驟的博客。

我錯過了明顯的東西嗎?

一般承認的答案

我這樣做的方法是將我想序列化的數據投影到匿名類型并序列化。這確保只有我在JSON中實際需要的信息被序列化,並且我不會無意中在對像圖中進一步序列化某些內容。它看起來像這樣:

var records = from entity in context.Entities
              select new 
              {
                  Prop1 = entity.Prop1,
                  Prop2 = entity.Prop2,
                  ChildProp = entity.Child.Prop
              }
return Json(records);

我發現匿名類型對此非常理想。顯然,JSON並不關心用它來生成它的類型。匿名類型為您提供了關於JSON中的屬性和結構的完全靈活性。


熱門答案

Microsoft將EF對象轉換為數據合同的方式出錯。它們包括基類和反向鏈接。

您最好的選擇是為要返回的每個實體創建等效的數據傳輸對像類。這些僅包括數據,而不包括行為,而不包括實體的EF特定部分。您還可以創建與DTO類進行轉換的方法。

然後,您的服務將返回數據傳輸對象。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因