AutoMapper игнорирует не производные свойства в динамической или не полностью определенной конфигурации отображения - PullRequest
1 голос
/ 05 апреля 2019

У меня проблема с моим кодом .NET CORE 2.1 и AutoMapper для отображения DTO в DomainModels и наоборот.

Первоначально я использовал DTO CreateRequest для создания данных, которые сопоставлены с моей моделью домена. Для целей обновления я использую DTO UpdateRequest, которое происходит от моего DTO CreateRequest. В моем классе UpdateRequest есть еще несколько свойств, которые также существуют в моем классе полной доменной модели.

Теперь я смог воспроизвести странную ошибку при чтении моей модели сразу после того, как она была создана запросом на создание. Обновление этой модели чтения с помощью моего UpdateRequest DTO с использованием AutoMapper поднимает следующую проблему: Свойство с именем «VersionNumber», кажется, игнорируется, в то время как другие свойства были успешно установлены. Похоже, AutoMapper сохранил унаследованный класс CreateRequest в качестве единственной существующей карты и использует его также для отображения производного класса UpdateRequest.

Я воссоздал эту ситуацию в LinqPad и добавил сюда используемый код.

static bool init = false;
void Main()
{
    init.Dump("IsInitialized"); 
    if (!init) 
    {
        // Configuration 1
        AutoMapper.Mapper.Initialize(cfg => { cfg.CreateMissingTypeMaps = true; cfg.ValidateInlineMaps = false; }); 

        // Configuration 2
//      AutoMapper.Mapper.Initialize(cfg => 
//      { 
//       cfg.CreateMap<Bar, Model>();
//       // Configuration 2, also define map for the derived type
////         cfg.CreateMap<Foo, Model>();
//      });

        init = true;
    }

    // Create model and save db changes
    Model created = AutoMapper.Mapper.Map<Model>(new Bar { Name="Bar" });
    created.Dump("Created");

    // Read model from db
    var b = new Model { Name = created.Name, VersionNumber = created.VersionNumber };

    // Create derived model to update read model
    var f = new Foo { Name = "Foo", VersionNumber = 123 };

    // Update entity
    var result = AutoMapper.Mapper.Map(f, b);
    b.Dump("Updated Bar");
    result.Dump("Result = Updated Bar");    
}

class Foo : Bar {
public long? VersionNumber {get; set;}
}

class Model {
public string Name {get; set;}
public long VersionNumber {get; set;}
}

class Bar {
public string Name {get;set;}
}

Далее я должен объяснить мою используемую конфигурацию. Конфигурация 1 была моей первой попыткой просто использовать «динамическую» конфигурацию карты. Конфигурация 2 использовалась при тестировании этой ошибки. И, наконец, отображение будет работать, только если вы определите оба типа, базовый тип и деривацию.

Результатом для 1 должно быть «VersionNumber» 123, вместо 0. То же самое для 2, не определяя это должным образом. Только использование 2 с обоими отображениями вызовет ожидаемый результат. Все три параметра конфигурации работают для свойства «Имя».

В LinqPad я ссылался на следующую версию AutoMapper: .... NuGet \ пакеты \ automapper \ 7.0.1 \ Lib \ netstandard2.0

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...