2015-09-01 55 views
0

我有一個員工類,這是一個實體框架代碼第一類代表一個員工。我想創建一個基於原始Employee類的視圖模型,然後將該類從linq查詢填充到我的EF上下文中。根據原始類將實體轉換爲擴展類?

public class EmployeeVM : Employee 
{ 
    public List<DepartmentSelect> Departments { get; set; } 
} 

EmployeeVM employee = context.Employees.Find(id); 

我得到錯誤「不能隱式地將Employee類型轉換爲EmployeeVM」。 有沒有簡單的方法來做到這一點,而不是創建一個新的對象,並將每個參數傳遞給新類中的等價物?

+2

Befor做任何事閱讀本頁https://msdn.microsoft.com/en-us/library/ee207183.aspx。最好將所有的屬性複製到你的viewModel類,因爲你對它們有更多的控制,例如你可以使用數據加註 – Arash

回答

1

如果編碼有一個簡單的按鈕,那就好了,但它就是這樣。您可以一次編寫代碼並在需要時重複使用它。你可以使用AutoMapper並處理一些隨之而來的麻煩。你最好的選擇就是自己寫,也許捕捉一些錯誤,如果你的上下文變化..

沒有一個映射器,你可以添加一個靜態func到你的viewmodel將採取一個Employee對象,並創建一個EmployeeVM和使用這在你的上下文查詢中。

public class EmployeeVM 
{ 
    public EmployeeVM() 
    { 
     Departments = new List<DepartmentSelect>(); 
    } 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime? Dob { get; set; } 

    public List<DepartmentSelect> Departments { get; set; } 

    public static Func<Employee, EmployeeVM> FromEntity = item => new EmployeeVM() { 
     Id = item.Id, 
     FirstName = item.FirstName, 
     LastName = item.LastName, 
     Dob = item.Dob 
    }; 
} 

// get single EmployeeVM 
var eVm = EmployeeVM.FromEntity(context.Employees.Find(id)); 

// get List<EmployeeVM 
var eVmList = context.Employees.Select(EmployeeVM.FromEntity).ToList(); 

這個心不是推薦,但如果員工是一個局部類,你總是可以只通過在同一個命名空間增加另一部分類擴展它。

public partial class Employee 
{ 
    //Add Extra Properties 
    public List<DepartmentSelect> Departments { get; set; } 
} 
+0

它並不是想要走簡單的路線,而是讓它們都工作,只是爲了發現那裏是一條我不知道的簡單路線。 ;) –

0

像AutoMapper這樣的工具旨在減輕擁有大量屬性映射代碼的負擔。您也可以將第一個對象序列化並將其反序列化爲第二個對象。

不過,我應該提到,這可能是對繼承的誤用。是否有理由不能直接將Employee實體作爲一個屬性放在EmployeeVm上?除此之外,Arash正確地指出ViewModels通常不應該與您的數據模型緊密結合。