自动映射器:属性名称与类名称冲突时,无法映射成员错误

时间:2019-07-17 08:32:59

标签: automapper

我正在尝试使用AutoMapper将具有嵌套复杂类型的实体压平为平面dto。

在大多数情况下,这可以正常工作。但是,如果dto中的属性名称与类名称之一相同,则AutoMapper将抛出错误,指出无法映射该属性。

在下面的示例中,Dto中的NestedComplexType属性具有与NestedComplexType类相同的名称。

public class Entity
{
    public int Id { get; protected set; }
    public NestedComplexType NestedComplexType { get; protected set; }
}

public class NestedComplexType
{
    public decimal Property { get; private set; }
}

public class Dto
{
    public decimal NestedComplexType { get; protected set; }
}

public static class AutoMapperConfiguration
{
    public static IMapper Configure()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<CustomProfile>();
        });

        config.AssertConfigurationIsValid();

        return config.CreateMapper();
    }
}

internal class CustomProfile : Profile
{
    public CustomProfile()
    {
        // Want to make complex type use the custom mapping NestedComplexType -> Dto,  rather than the default mapping
        CreateMap<Entity, Dto>()
            .IncludeMembers(x => x.NestedComplexType);

        CreateMap<NestedComplexType, Dto>(MemberList.None)
            .ForMember(m => m.NestedComplexType, o => o.MapFrom(x => x.Property));
    }
}

void Main()
{
    var mapper = AutoMapperConfiguration.Configure();   
}

这会导致错误,提示无法映射NestedComplexType,添加自定义映射表达式等。

我可以通过映射来自ComplexType的所有内容来解决此问题,例如

    public CustomProfile()
    {
        // Workaround
        CreateMap<Entity, Dto>()
            .ForMember(m => m.NestedComplexType, o => o.MapFrom((s, d) => s.NestedComplexType?.Property));
    }

理想情况下,我希望能够显式地告诉Entity-> Dto映射使用NestedComplexType-> Dto的自定义映射,而不是使用基于默认名称的约定。有办法吗?

0 个答案:

没有答案