Я обновил с AutoMapper 2.0.0 до 2.2.0 сегодня и понял, что обновление сломало некоторый код. Хотелось спросить об этом здесь, прежде чем публиковать сообщения в качестве проблемы на сайте gap.mapapper.
Один из моих целевых типов инициализирует свойство коллекции следующим образом:
public class PageOf<TModel>
{
public PageOf()
{
Items = Enumerable.Empty<TModel>();
}
public IEnumerable<TModel> Items { get; set; }
}
С automapper 2.0.0 это было прекрасно. Когда я обновился до 2.2.0, сопоставление с этим типом адресата вызвало NotSupportedException с сообщением "Коллекция имела фиксированный размер". (Это исключение было обернуто в исключение AutoMapperMappingException.)
Мне удалось исправить проблему, изменив код конструктора выше:
public PageOf()
{
Items = new List<TModel>();
}
Кажется, что AutoMapper 2.0.0 отбрасывал любое значение в свойстве Items и использовал свойство set
Property accessor, тогда как AutoMapper 2.2.0 просто использует свойство access get
и пытается изменить существующий IEnumerable, Похоже, что Enumerable.Empty<TModel>()
просто заменяет массив нулевой длины, что объясняет исключение.
Это ошибка? Что в AutoMapper изменилось между 2.0.0 и 2.2.0, что приведет к тому, что он проигнорирует набор свойств целевого объекта и вместо этого попытается изменить существующую коллекцию?
Update:
Как запрошено, вот вызов CreateMap:
public class PagedQueryResultToPageOfItemsProfiler : Profile
{
protected override void Configure()
{
CreateMap<PagedQueryResult<EstablishmentView>, PageOfEstablishmentApiModel>();
}
}
Класс PageOfEstablishmentApiModel
наследуется от PageOf<EstablishmentApiModel>
.
Вот код Mapper.Map:
var query = Mapper.Map<EstablishmentViewsByKeyword>(input);
var results = _queryProcessor.Execute(query);
var model = Mapper.Map<PageOfEstablishmentApiModel>(results); // exception here
Если требуется специальная конфигурация отображения (например .ConvertUsing(x = > x)) в AutoMapper, идущем от 2.0.0 до 2.2.0, мы можем придется висеть на старой версии. Мне всегда нравилось, как AM автоматически конвертирует свойства коллекции, и без этого AM кажется больше похожим на ValueInjecter.