在SQL中使用ViewModel属性的自动映射器

时间:2019-01-22 12:21:11

标签: c# asp.net-mvc entity-framework enums automapper

enumautomapper的问题

我有一个使用enum作为属性之一的EF数据集,并使用一个视图模型将其显示在带有enumToString的网格上以显示文本值enum

我正在使用AutoMapper将EF类映射到ViewModel类,但是在加载数据时出现错误

  

System.NotSupportedException:'指定的类型成员   LINQ to Entities不支持'DataTableTypeDisplay'。只要   初始化程序,实体成员和实体导航属性是   支持。

我尝试为DataTableTypeDisplay的配置添加忽略选项,并且保持不变。

如果我删除此属性,则工作正常,但是网格仅显示int的{​​{1}}值

使用Enum

类文件

AutoMapper v7.0.1

查看模型

public class ClassName
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ClassNameId { get; set; }

    public DataTableType DataTableType { get; set; }
…

AutoMapper配置

public class ClassNameGridViewModel : ChangeControlBase
{
    public Guid? ClassNameId { get; set; }

    public DataTableType DataTableType { get; set; } = DataTableType.None;

    [NotMapped]
    public string DataTableTypeDisplay
    {
        get { return DataTableType.ToString(); }
    }
…

枚举

public ClassNameGridViewModelProfile()
    {
        CreateMap<NS.ClassName, NS.ClassNameGridViewModel>();

        CreateMap<NS.ClassNameGridViewModel, NS.ClassName>();
    }

2 个答案:

答案 0 :(得分:0)

AFAIK Automapper不使用[NotMapped]属性。它确实具有[IgnoreMap]属性,但这意味着将Automapper引用添加到受影响的实体。或者,当您为Entity-> VM配置映射时:

Mapper.CreateMap<ClassName, ClassNameGridViewModel>()
.ForMember(vm => vm.DataTableTypeDisplay, opts => opts.Ignore())

答案 1 :(得分:0)

事实证明该问题并非是Automapper能够按预期工作,我还使用了Telerik DataSource Request,该请求向基础查询添加了排序,过滤器分组和分页功能,因为SQL表中不存在DataTableTypeDisplay列,这是导致错误。

我当前的解决方案是将enum移动到数据库中的表并通过导航属性进行映射。