.NET CORE 2.1代码和将DTO映射到DomainModels的AutoMapper遇到了问题,反之亦然。
最初,我使用CreateRequest DTO创建数据,该数据映射到我的域模型。出于更新原因,我使用从我的CreateRequest DTO派生的UpdateRequest DTO。我的UpdateRequest类还具有其他一些属性,这些属性也存在于我的完整域模型类中。
现在,在由创建请求创建模型实体之后,立即读取模型实体时,我能够重现一个奇怪的错误。使用AutoMapper使用我的UpdateRequest DTO更新此读取模型会引发以下问题: 似乎已忽略名为“ 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 \ packages \ automapper \ 7.0.1 \ lib \ netstandard2.0
我希望在动态配置的初始映射期间发生错误,或者AutoMapper认识到我要映射派生类型,因此必须使用其他映射。