У меня проблема с моим кодом .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 распознает, что я хочу отобразить производный тип и, следовательно, должен использовать другую карту.