.net core 使用AutoMapper映射派生类型似乎无法正常工作

.net core 使用AutoMapper映射派生类型似乎无法正常工作,.net-core,automapper,.net Core,Automapper,我们已经设置了一个具有多个派生类型的基类 public class Base { public int BaseProperty { get; set; } } public class Derived1 : Base { } public class Derived2 : Derived1 { public int Derived2Prop { get; set; } } 我们还建立了衍生DTO模型 public class BaseDto { public i

我们已经设置了一个具有多个派生类型的基类

public class Base
{
    public int BaseProperty { get; set; }
}

public class Derived1 : Base { }

public class Derived2 : Derived1
{
    public int Derived2Prop { get; set; }
}

我们还建立了衍生DTO模型

public class BaseDto
{
    public int BaseProperty { get; set; }
}

public class Derived1Dto : BaseDto { }

public class Derived2Dto : Derived1Dto
{
    public int Derived2Prop { get; set; }
}
AutoMapper配置映射如下

CreateMap<Base, BaseDto>()
    .Include<Derived1, Derived1Dto>()
    .ReverseMap();

CreateMap<Derived1, Derived1Dto>()
    .Include<Derived2, Derived2Dto>()
    .ReverseMap();

CreateMap<Derived2, Derived2Dto>()
    .ReverseMap();

映射派生类型时将使用基类型的映射。这里不需要
包含
。您只需要
CreateMap()

一切都按预期工作。检查文件,并检查回购协议中的测试。我不知道你为什么希望第二次测试通过。要得到你想要的结果,你只需要一个映射,
CreateMap()
@LucianBargaoanu谢谢你的回答。我希望第二个测试能够通过,因为Derived2和DerivedDto2的映射配置为分别扩展Base和BaseDto类。当映射BaseDto->Derived2时,我看到的行为与映射derived2To->Derived2时不同。你同意我的看法吗?如果没有,请详细说明为什么会出现这种行为?我一点也不理解:)再次,回到文档和测试。你知道你只需要一个映射就能让两个测试都通过吗?@LucianBargaoanu就像你提到的,我只需要一个映射:
CreateMap()
。太好了文档中的D描述了如何配置继承。在我的映射配置文件中,我试图设置此设置,但在我的情况下,这是不必要的。这是否意味着默认情况下AutoMapper总是尝试映射派生类型?
[Test]
public void MappingBaseDtoToDerived()
{
    var mapperConfiguration = new MapperConfiguration(config =>
    {
        config.AddProfile(new BaseMapping());
    });
    var mapper = mapperConfiguration.CreateMapper();

    var dto = new BaseDto { BaseProperty = 1234 };

    var model = new Derived2 { Derived2Prop = 5678 };

    var mapped = mapper.Map(dto, model);

    Assert.AreEqual(5678, model.Derived2Prop);
}

[Test]
public void MappingDerivedDtoToDerived()
{
    var mapperConfiguration = new MapperConfiguration(config =>
    {
        config.AddProfile(new BaseMapping());
    });
    var mapper = mapperConfiguration.CreateMapper();

    var dto = new Derived2Dto { BaseProperty = 1234 };

    var model = new Derived2 { Derived2Prop = 5678 };

    var mapped = mapper.Map(dto, model);

    Assert.AreEqual(5678, model.Derived2Prop);
}