根据原始类将实体转换为扩展类?

时间:2015-09-01 20:15:08

标签: c# linq

我有一个Employee类,它是一个代表Employee的Entity Framework代码第一类。我想基于原始的Employee类创建一个视图模型,然后将该类从linq查询填充到我的EF上下文。

var cookieValue = Request.Cookies["JSESSIONID"].Value;

我收到错误"无法隐式转换类型Employee到EmployeeVM。" 有没有一种简单的方法可以做到这一点,而不是创建一个新对象并将每个参数预先设置到新类中的等价物中?

3 个答案:

答案 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通常不应与您的数据模型紧密耦合。