将实体转换为基于原始类的扩展类

本文关键字:原始 扩展 转换 实体 于原始 | 更新日期: 2023-09-27 18:10:42

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

 public class EmployeeVM : Employee
{  
    public List<DepartmentSelect> Departments { get; set; }
}
EmployeeVM employee = context.Employees.Find(id);

我得到错误"cannot implicit convert type Employee to EmployeeVM "。是否有一种简单的方法来做到这一点,而不是创建一个新对象,并在新类中的等效的每个参数?

将实体转换为基于原始类的扩展类

如果编码有一个简单的按钮就好了,但它就是这样…您可以一次性编写代码,并在需要时重用它。你可以使用AutoMapper来处理随之而来的一些麻烦。你最好的办法是自己写,如果你的上下文改变了,可能会发现一些错误。

如果没有映射器,你可以在视图模型中添加一个静态函数,它将接受一个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; }
}

你可能想使用Automapper。http://automapper.org/

像AutoMapper这样的工具被设计用来减轻拥有一堆属性映射代码的负担。也可以只序列化第一个对象,然后反序列化到第二个对象。

我应该指出,这可能是对继承的误用。是否存在不能将Employee实体直接作为属性放在EmployeeVm上的原因?除此之外,Arash指出ViewModels通常不应该与数据模型紧密耦合,这一点是正确的。