2016-11-14 2 views
0

Пытается обновить до AutoMapper 5.1 из v4.2 и обнаруживаю, что коллекция не отображается во время выполнения - исходный объект имеет элементы в коллекции, но свойство назначения сопоставления пуст.Вложенные коллекции, не работающие в AutoMapper 5.1

Под 4.2, все работало точно так, как ожидается, с одной и той же конфигурации отображения (за исключением MemberList.None в() CTOR CreateMap)

меня DTOs как так

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>(); 
} 

и подтверждение Mapping как так

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 <, коллекция уездах StateViewModel пуст (список с 0 пунктов), даже если исходный объект имеет элементы в своей коллекции .Counties:

var st = new State() 
... (initialize the state, including the .Counties list) 
var stateViewModel = Mapper.Map<StateViewModel>(st); 

Все ключи будет оценена!

ответ

0

После некоторого копания выясняется, что обновление AutoMapper 5 ввело некоторые нарушения. В частности, поведение изменилось в таких случаях, как у меня, где коллекция получателей имеет геттер, но нет сеттера. В AutoMapper 4 по умолчанию использовалось свойство назначения по умолчанию, а не пыталось создать новый экземпляр. AutoMapper 5 НЕ делает это по умолчанию.

Решения сказать AutoMapper использовать значение назначения в явном виде:

.ForMember(dest => dest.Counties, o => o.UseDestinationValue()) 

Я уверен, что есть хорошая причина для введения отключающих изменений, как это, но это не вызывает никакого конца душевной боли, когда вы» ve реализовал широкий шаблон и теперь должен выследить и зафиксировать каждый сопоставленный объект, на который может повлиять это изменение.

У меня почти искушение просто поручиться на обновление и придерживаться Automapper 4.2, так как он сделал именно то, что мне было нужно, без необходимости в дополнительной и ненужной конфигурации.

Для получения дополнительной информации см. https://github.com/AutoMapper/AutoMapper/issues/1599

Смежные вопросы