2017-10-17 45 views
5

我有一个项目使用AutoMapper 3.1.1,我能够隔离我遇到的问题。为什么意外映射在AutoMapper中发生?

这里是我的测试类:

class BaseClass 
{ 
    public string PropertyA { get; set; } 
} 

class DerivedClass: BaseClass 
{ 
    public string PropertyB { get; set; } 
} 

class ContainerClass 
{ 
    public DerivedClass ComplexProperty { get; set; } 
    public string PropertyC { get; set; } 
} 

class SourceClass 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
    public string PropertyC { get; set; } 
} 

这里是我的映射规则:

Mapper.CreateMap<SourceClass, ContainerClass>() 
    .ForMember(d => d.ComplexProperty, o => o.MapFrom(s => Mapper.Map<DerivedClass>(s))) 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("SourceClass-> ContainerClass mapped")); 

Mapper.CreateMap<SourceClass, DerivedClass>() 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("SourceClass -> DerivedClass mapped")); 

Mapper.CreateMap<BaseClass, DerivedClass>() 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("BaseClass -> DerivedClass mapped")); 

这是我的代码:

var source = new SourceClass { 
    PropertyA = "ValueA", 
    PropertyB = "ValueB", 
    PropertyC = "ValueC", 
}; 

var destination = Mapper.Map<ContainerClass>(source); 

Console.WriteLine("PropertyA: " + destination?.ComplexProperty?.PropertyA); 
Console.WriteLine("PropertyB: " + destination?.ComplexProperty?.PropertyB); 
Console.WriteLine("PropertyC: " + destination?.PropertyC); 

的输出是:

PropertyA: ValueA 
PropertyB: 
PropertyC: ValueC 

我期望PropertyB的值为“ValueB”,但它的值为null。它发生了,因为从BaseClass到DerivedClass的映射器执行的原因是某种原因。我的调试输出如下:

SourceClass -> DerivedClass mapped 
BaseClass -> DerivedClass mapped 
SourceClass -> ContainerClass mapped 

为什么AutoMapper执行BaseClass - > DerivedClass映射?


UPDATE: 谢谢马吕斯现在我知道,从BaseClass的到DerivedClass该映射无效。他建议我不能删除这个映射规则,因为我需要它用于我的应用程序。作为例外,建议我加忽略了PropertyB:

Mapper.CreateMap<BaseClass, DerivedClass>() 
    .ForMember(d => d.PropertyB, o => o.Ignore()) 
    .AfterMap((s, d) => System.Diagnostics.Debug.WriteLine("BaseClass -> DerivedClass mapped")); 

现在Mapper.AssertConfigurationIsValid();不会抛出异常了。但原来的问题依然存在。为什么AutoMapper执行BaseClass - > DerivedClass映射?

回答

1

调试时AutoMapper问题,我建议通过调用Mapper.AssertConfigurationIsValid();我把它添加到您的代码来验证配置和我得到了以下异常消息:

错误消息:AutoMapper.AutoMapperConfigurationException:发现未映射 成员。查看下面的类型和成员。添加自定义 映射表达式,忽略,添加自定义解析器或修改源/目标类型

======================== ==========

的BaseClass - > DerivedClass(目标成员列表)src.BaseClass - > src.DerivedClass (目标成员列表)

PropertyB

你可以通过去除BaseClass -> DerivedClass的映射来解决问题。然后还致电Mapper.AssertConfigurationIsValid();不再抛出。

+0

我更新了我的问题。我不能只删除BaseClass - > DerivedClass,我需要它为我的应用程序。 –