Automapper с использованием свойства ViewModel в Sql - PullRequest
0 голосов
/ 22 января 2019

Возникла проблема с enum с automapper

У меня есть набор данных EF, использующий enum в качестве одного из свойств и модель представления для отображения этого на сетке с помощью enum и ToString для отображения текстового значения enum

Я использую AutoMapper для сопоставления класса EF с классом ViewModel, но при загрузке данных я получаю ошибку

System.NotSupportedException: 'Указанный элемент типа' DataTableTypeDisplay 'не поддерживается в LINQ to Entities.Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.

Я попытался добавить параметры игнорирования в конфигурацию для DataTableTypeDisplay без изменений.

Работает нормально, еслиЯ удаляю это свойство, но тогда в таблице отображается только значение int для Enum

с использованием AutoMapper v7.0.1

Файл класса

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

    public DataTableType DataTableType { get; set; }
…

Просмотр модели

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

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

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

Конфигурация AutoMapper

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

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

Enum

public enum DataTableType
{
    None = 0,
    Type1 = 1,
    Type2 = 2,
    Type3 = 3,
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Проблема оказалась не в Automapper, который работал должным образом, я также использую Telerik DataSource Request, который добавляет сортировки, фильтры, группирование и разбиение на страницы к базовому запросу, так как столбец DataTableTypeDisplay не существует в таблице SQL, этовызывая ошибку.

Мое текущее решение состоит в том, чтобы переместить enum в таблицу в базе данных и отобразить с помощью свойства навигации.

0 голосов
/ 23 января 2019

AFAIK Automapper не использует атрибут [NotMapped]. У него есть атрибут [IgnoreMap], но это означает добавление ссылки Automapper к вашим затронутым объектам. В качестве альтернативы, когда вы настраиваете свои сопоставления для Entity -> VM:

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