2016-08-19 32 views
1

我需要做一些對象之間的映射(例如PersonModel到PersonViewModel),並且正在研究不同的方法來做到這一點。具體來說,我正在使用實體框架並嘗試將生成的模型映射到視圖模型。.NET中的對象 - 對象映射有哪些不同的方法?

但是,我還沒有找到一篇文章或資源來編譯你如何做到這一點。到目前爲止,我遇到了以下幾點:

  • 隱式轉換
  • 擴展方法(我認爲這是最基本的方法,因爲您手動從一個對象到另一個,它簡單而繁瑣的映射屬性?) (有沒有跟這個工作還)
  • 反射(我已經修修補補了一點,但只有管理非常基本的映射)
  • Automapper(很受歡迎,但我無法使其與EF很好地工作)
  • 超值注射器(尚未與此合作)
  • 的Emit映射器(也沒有這個工作還沒有,但可能我會有麻煩使其與EF工作?)

能否請你幫指出並闡述有可用的方法,以及利弊/每個的利弊?例如,我看到一些提到的Automapper比手動映射慢?或者可能指出一篇文章解決這個問題?

編輯:因爲有些人可能會問我有什麼問題AutoMapper,請參閱本:Automapper: How to map IList to EntityCollection

+0

你在問整本文章甚至書本章節。 SO是一個問答網站。並且Automapper在使用EF時沒有問題,主要是因爲EF返回的對象是普通的舊對象。如果你使用EF特定的類,比如'EntityCollection',你做錯了。檢查所有教程,你會看到他們使用最基本的'ICollection ' –

回答

2

好吧,我可以給你一個方法,你做你自己的映射,很簡單的事,並且可以迅速地執行超過大量的數據。我會告訴你我會做什麼,然後試着闡述我爲什麼要做我所做的事情。這裏有:

public class PersonViewModel 
{ 
    public static Expression<Func<Person, PersonViewModel>> FromPerson 
    { 
     get 
     { 
      return p => new PersonViewModel 
      { 
       Name = p.FirstName, 
       SurName = p.LastName 
      }; 
     } 
    } 

    public string Name { get; set; } 
    public string SurName { get; set; } 
    public static PersonViewModel CreateViewModel(Person original) 
    { 
     var func = FromPerson.Compile(); 
     var vm = func(original); 

     return vm; 
    } 
} 

現在你會注意到我有2種方法從Person EF模型轉換到ViewModel。這是因爲使用Expression>的第一個用於在Select()語句中轉換大量對象。簡單的用法:

return people.Select(PersonViewModel.FromPerson); 

在這種情況下,我們可能已經檢索到的人的集合,從數據庫對象,並需要向他們展示,比如說,在一個列表或東西,但使用的視圖模型。通過這種方式,操作是批量執行的,比通過其他方法創建所有對象要快得多。現在,可以使用靜態CreateViewModel方法在需要的地方映射單個對象。一個例子是,如果您從數據庫獲取單個用戶的數據並需要顯示它,但使用ViewModel。在這種情況下,應該使用靜態方法,而不是主要用於批量轉換的表達式。

這就是我所能提供的,除了想知道使用AutoMapper有什麼問題,因爲它非常簡單,而且您還沒有詳細闡述與EF一起使用時的問題。希望這可以幫助你至少在你的問題一點:)

+0

我建議'CreateViewModel'將使用'FromPerson'來減少代碼重複。幾乎任何現實生活中的映射都會有更多的屬性,所以應用DRY(不要重複自己)原則是有道理的。 – Phil1970

+0

啊,你是對的,我實際上已經忘記了,因爲我在飛行中寫了它,感謝修正,將會修復它。 –