AutoMapper会忽略动态或完全合格的映射配置中未派生的属性

时间:2019-04-05 11:23:24

标签: c# .net-core automapper-7

.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认识到我要映射派生类型,因此必须使用其他映射。

0 个答案:

没有答案