尝试从v4.2升级到AutoMapper 5.1并发现集合在运行时没有映射 - 源对象在集合中有项目,但映射的目标属性为空。
在4.2下,一切都按预期完成,具有相同的映射配置(除了CreateMap()ctor中的MemberList.None)
我有像这样的DTO
public class GeographicEntity
{
...
}
public class County : GeographicEntity
{
...
}
public class State : GeographicEntity
{
public List<County> Counties { get; } = new List<County>();
}
和viewmodels一样
public class GeographicEntityViewModel
{
...
}
public class CountyViewModel : GeographicEntityViewModel
{
...
}
public class StateViewModel : GeographicEntityViewModel
{
public List<CountyViewModel> Counties { get; } = new List<CountyViewModel>();
}
和映射确认一样
Mapper.Initialize(configuration =>
{
configuration.CreateMap<GeographicEntity, GeographicEntityViewModel>(MemberList.None);
configuration.CreateMap<County, CountyViewModel>(MemberList.None)
.IncludeBase<GeographicEntity, GeographicEntityViewModel>();
configuration.CreateMap<State, StateViewModel>(MemberList.None)
.IncludeBase<GeographicEntity, GeographicEntityViewModel>();
});
Mapper.Map&lt;&gt;之后调用,StateViewModel的Counties集合为空(带有0项的列表),即使源对象在其.Counties集合中有项目:
var st = new State()
... (initialize the state, including the .Counties list)
var stateViewModel = Mapper.Map<StateViewModel>(st);
任何线索都会受到赞赏!
答案 0 :(得分:0)
经过一番挖掘后,事实证明AutoMapper 5升级引入了一些重大变化。具体来说,在我的目标集合具有getter但没有setter的情况下,行为已经改变。在AutoMapper 4中,默认行为是默认使用目标属性,而不是尝试创建新实例。默认情况下,AutoMapper 5不会这样做。
解决方案是告诉AutoMapper明确使用目标值:
.ForMember(dest => dest.Counties, o => o.UseDestinationValue())
我确信有一个很好的理由可以引入这样的突破性变化,但是当你实现了一个广泛的模式并且现在必须寻找并修复可能受到影响的每个映射对象时,它不会让人心痛。这种变化。
我几乎想要保证升级并坚持使用Automapper 4.2,因为它完全符合我的需要而不需要额外的和不必要的配置。
有关详细信息,请参阅https://github.com/AutoMapper/AutoMapper/issues/1599