我有一个Employee类,它是一个代表Employee的Entity Framework代码第一类。我想基于原始的Employee类创建一个视图模型,然后将该类从linq查询填充到我的EF上下文。
var cookieValue = Request.Cookies["JSESSIONID"].Value;
我收到错误"无法隐式转换类型Employee到EmployeeVM。" 有没有一种简单的方法可以做到这一点,而不是创建一个新对象并将每个参数预先设置到新类中的等价物中?
答案 0 :(得分:1)
如果编码有一个简单的按钮就好了,但它就是它。你可以编写一次代码并在需要时重复使用它。您可以使用AutoMapper并处理随之而来的一些令人头疼的问题。您最好的选择就是自己编写,如果您的上下文发生变化,可能会发现一些错误。
如果没有映射器,您只需向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();
这不推荐使用,但如果Employee是一个部分类,你总是可以通过在同一名称空间中添加另一个部分类来扩展它。
public partial class Employee
{
//Add Extra Properties
public List<DepartmentSelect> Departments { get; set; }
}
答案 1 :(得分:0)
您可能想要使用Automapper。 http://automapper.org/
答案 2 :(得分:0)
像AutoMapper这样的工具旨在减轻拥有大量属性映射代码的负担。您也可以序列化第一个对象并将其反序列化为第二个对象。
但是,我应该提一下,这可能是对继承的滥用。您是否有理由将您的Employee实体直接作为属性直接放在EmployeeVm上?除此之外,Arash指出ViewModel通常不应与您的数据模型紧密耦合。