4

我使用EF 4.1數據庫優先方法,使用T4模板在單獨的程序集中生成我的POCO類。我有用於獲取數據的存儲庫以及用於與UI進行通信的服務層。EF 4.1 + MVC + JSON循環引用異常的最佳解決方案?

我正試着做級聯下拉菜單。 我是MVC和EF 4.1中的新成員,所以我搜索了可能的解決方案。

這是樣品ViewModel類:

public class MyViewModel 
{ 
public int CustomerId { get; set; } 
public string CustomerName { get; set; } 
public IEnumerable<Phone> Phones { get; set; } 
} 

我至今讀,解決方案是:

  1. 使用ScriptIgnoreAttributeSystem.Web.Script.Serialization上 參考性 - 我不 真的想要這樣做,因爲我 不想添加引用 System.Web在我的POCO項目中

  2. 禁用延遲加載在EF 4.1的DbContext - 我不知道我想和使用包括制定深入我的項目

  3. 返回匿名類型 - 我會用這種方法,當我的項目得到大的問題?

  4. 使用ViewModel - 假設我有一個客戶可以有一個或多個電話。在第一個下拉列表中,您可以選擇客戶,然後在第二個下拉列表中顯示他所有的手機。
    但是,這不會在我的Phones對象上生成一個循環異常嗎?或者我會爲我的電話對象製作一個特殊的課程?這似乎是很多不必要的代碼。

  5. 使用AutoMapper - 沒有AutoMapper的經驗,所以我不知道它有多複雜。

你會爲哪一票投票,爲什麼?

回答

5

使用視圖模型和AutoMapper來映射您的域模型和要發送到視圖的視圖模型。通過這種方式,您可以完全控制向視圖發送哪些屬性,從而減少服務器和客戶端之間發送的數據量。另外,因爲現在您正在使用視圖模型,您的代碼在您的域實體中的修改更具彈性。如果您修改它們,則只有映射圖層會受到影響,因此您不需要觸摸控制器或視圖。

所以我的建議是下載AutoMapper,閱讀文檔並開始使用它。這是一個改變生活的人,相信我。

+0

我可以使用我的示例類作爲viewmodel嗎?我是否有Phone實體的循環參考序列化問題(也是由EF 4.1生成的POCO)? –

+0

@MarkoTošić,你擁有的不是視圖模型,因爲它包含對你的域模型(電話)的引用。這是一些混合,如果這個電話類本身有其他領域模型的引用,你會很快結束了同樣的問題。不要這樣做。定義一個純視圖模型類。 –

+0

因此,我將不得不爲我的Phone模型對象類定義一個DTO PhoneDTO類,然後在ViewModel中擁有IEnumerable 屬性? 我試圖找到一個「更容易」的解決方案,但最終,這似乎是正確的做法。 P.S. sry,我沒有足夠的代表投票了。 –