使用 Enum 属性 从具有整数 属性 的模型投影到 class

Projecting from a model with an integer property to class with Enum property

我的模型 classes 设置了整数属性,就像它们存储在数据库中一样。因此示例模型可能如下所示:

public class TaskModel
{
    public int TaskId { get; set; }
    public int TaskStatus { get; set; }
}

但是在我的实际业务中 classes 我想使用枚举,所以匹配的业务 class 看起来像:

public class Task
{
    public int TaskId { get; set; }
    public Status TaskStatus { get; set; }
}

然后我想使用 Automapper 的 LINQ 投影功能来查询这些业务 classes,例如:

 return db.Tasks.Where( t => t.TaskStatus == 1 ).Project().To<Task>();

但是当我这样做时我得到这个错误:

Unable to create a map expression from System.Int32 to MyNamespace.TaskStatus

我已经能够通过这样设置映射来解决它:

Mapper.CreateMap<TaskModel, Task>()
   .ForMember(t => t.TaskStatus, opt => opt.MapFrom(m => (TaskStatus)m.TaskStatus))
   .ReverseMap();

这似乎有效(到目前为止),但我的问题是有更好的或更干燥的方法来做到这一点。问题是我需要对大量模型和 classes 中的大量属性执行此操作。似乎应该有一种更简单的方法来完成本质上简单的强制转换,而不必编写 100 行映射代码。

您可以使用类型转换器来做到这一点:

Mapper.CreateMap<int, TaskStatus>()
    .ProjectUsing(src => (TaskStatus)src);

这将无处不在。你必须这样做的原因是因为一些 LINQ 提供者有不同的方式来处理枚举转换和持久性,所以你必须使用它期望的正确表达式(并且 AutoMapper 不假设它知道什么是 EF 或 NHibernate 或任何需要) .