2017-09-13 130 views
0

我剛開始學習實體框架,我面臨着與生成模型序列化相關的問題。我有一個國家和國家一對多關係的表格,因爲一個國家有許多國家。我使用數據庫優先的方法,當我使用實體框架創建實體時,類Country具有ICollection的一個屬性。我閱讀並發現這是導航屬性。讓我先顯示下面生成的類:如何在實體框架中使用延遲加載來序列化實體?

//這是生成的類。

public class Country 
    { 
     public Country() 
     { 
       States = new HashSet<States>(); 
     } 
     public int Id { get; set; } 
     public string ContryCode { get; set; } 
     public string ContryName { get; set; }  
     public virtual ICollection<States> States{ get; set; } 

    } 

我生成的模型,然後我一步轉發。然後,當我通過ajax獲取國家/地區名單時,我遇到了序列化問題。我搜索了一下,發現了一些術語,如懶加載,急切加載和n + 1問題。我詳細閱讀了它。我找到了一個關閉延遲加載的解決方案。現在的問題是如何我可以序列化我的模型與延遲加載?

我已經創建了MetaData類並使用了像ignoreXml等一些屬性,但沒有任何幫助。順便說一下,我使用Asp.Net MVC 5,我想用惰性加載序列化我的模型。任何人都可以解釋嗎?

+0

我可以在一些批處理或者爲什麼延遲加載希望胖客戶端應用程序理解。但是,對於延遲加載更適合的Web應用程序,您有什麼用例(除了不想考慮包含哪些內容)呢? –

+0

@KyleBurns我沒有任何用例。但是我想知道如果我們在任何情況下使用延遲加載。那麼我們如何序列化模型? – Umer

+0

你是否收到「上下文處置」錯誤? – JuanR

回答

2

當您使用延遲加載時,延遲執行直到實際需要該屬性的值。您可能遇到錯誤,因爲在訪問該屬性時已經處理了上下文。考慮以下情形:

  • 你有一個名爲States懶加載特性稱爲Country的對象。
  • 您從上下文中獲取此對象。
  • 處理上下文。
  • 您致電States屬性。
  • 該屬性去尋找它來自的上下文。
  • 由於「上下文已處理」而引發錯誤。

代碼示例:

using(var context = new SomeEntityContext()) 
{ 
    var country = context.Countries.First(); 
} 

//This will throw an error because the context was disposed of. 
var states = country.States; 

串行器也將拋出一個錯誤,因爲它會經過對象的屬性,它會找到States,它會嘗試得到它的價值。

即使上下文仍處於活動狀態,您可能會在序列化期間遇到具有導航屬性的循環。這是因爲兩個對象都有一個對方的引用。考慮以下情形:

  • 你有一個名爲States懶加載特性稱爲Country的對象。
  • 串行器嘗試序列化Country類型的對象。
  • 它讀取States集合。
  • 它試圖序列化State類型的每個對象。
  • 它讀取Country類型的屬性。
  • 它嘗試序列化Country類型的對象。
  • 它讀取States集合。
  • 它試圖序列化State類型的每個對象。
  • 它讀取Country類型的屬性。
  • 它讀取States集合。
  • 它試圖序列化State類型的每個對象。
  • 它讀取Country類型的屬性。
  • 它讀取States集合。
  • 它試圖序列化State類型的每個對象。
  • 它讀取Country類型的屬性。
  • ....(無盡的循環,至少,直到你用完堆棧幀)。

或者,您可以創建一個自定義序列化程序,以避免導航屬性的缺陷,但這可能比它的價值更多的工作。這種方法最適合於序列化版本與對象顯着不同的情況。

這就是爲什麼你最好使用數據傳輸對象(DTO)。將數據映射到該對象並通過電線發送。如果您保持結構儘可能相似,那麼有些組件可以爲您進行映射。

退房AutoMapper:http://automapper.org/

+0

@Jaun謝謝你的回答。如果沒有DTO,我們可以做同樣的工作嗎? – Umer

+0

@Umer:我擴展了我的答案以幫助您理解。 – JuanR

+0

@Jaun,謝謝你的詳細解答。 – Umer

相關問題