2016-07-19 179 views
0

在ASP.NET Web API的JSON序列化過程中避免使用實體框架6進行循環引用的可能性是什麼?EF6:如何避免循環引用?

我爲Entity Framework 6數據庫首先生成了一個edmx(實體數據模型)文件。我嘗試使用ASP.NET Web API構建API。當我嘗試在我的控制器中返回我的JSON對象時,由於循環引用,我得到了序列化的運行時異常。

事實上,當我仔細檢查我的數據庫和我的實體時,我發現我的一個實體包含一個列表,其中包含我以前的實體列表的另一個實體。假設我有一個包含作者的書實體,並且每個作者實體都包含書籍列表。這是相對數據庫常見的東西,但無法在JSON序列化中解析(或無法解析.NET序列化程序)。

我不想更改我的數據庫,但我已準備好將錯誤列表分解爲我的實體或edmx文件。我能做什麼?

我曾嘗試:

我已經嘗試過,包括創建新模型或實體使用映射工具(http://www.codeproject.com/Articles/292970/Avoiding-Circular-Reference-for-Entity-in-JSON-Ser或通過Pluralsight解釋肖恩Wildermuth解決方案)的解決方案。

該解決方案聽起來更像是一種解決方法,而不是真正的解決方案。它應該在edmx文件或實體框架中存在一些內容,告訴JSON序列化程序可能導致循環引用的內容,可以並且必須被序列化的內容以及不能被序列化的內容,對不對?

+1

沒錯,你可以將此問題重複。請在這種情況下,鏈接到重複的答案。除了我已經嘗試過的東西之外,我什麼也沒找到 –

回答

1

直接序列化域模型在技術上沒有問題。爲避免循環引用,您不能使用延遲加載。你必須保持加載的控制。要做到這一點

  1. 設置懶加載配置中刪除模型的每個集合之前的虛擬(代碼第一種方法),以假(在數據庫中第一種方法)
+1

你有沒有試過忽略參考循環處理? http://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected –

1

不要嘗試直接序列化您的域模型。創建一個視圖模型,以所需的確切格式返回數據。使用你的域模型填充視圖模型。這裏有更多的信息Why do we use ViewModels?

+1

我明白這個主意,但這不尊重不要重複自己的規則。 –

+0

當您創建視圖模型時,您正在定義數據的公共視圖。您的域模型是您的團隊和內部利益相關者如何描述您的業務功能。您可能需要重構這些內部結構,同時保持公衆視圖完全相同。 – Fran

+0

是且不是...... OOP的想法是您的模型,您的領域模型也必須是您的視圖模型。這對於尊重不要重複自己的規則很重要。另外,您仍然需要將您的域模型的每個變量映射到您的業務模型,並且您仍然在做每個人在數據集時做過的同樣的事情。 –