Подтвердить что ты не робот

Является ли это изменением между AutoMapper 2.0.0 и 2.2.0?

Я обновил с 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.

4b9b3361

Ответ 1

Вы пытались использовать метод Map таким образом: Mapper.Map<DestinationClass, SourceClass>(object to convert)

?

С версией AutoMapper версии 2.2 мы используем ее, и она отлично подходит для нас.

Ответ 2

Я предполагаю, что он пытается добавить в вашу коллекцию, но так как ваша коллекция является экземпляром readonly (Enumerable.Empty<T>), она не может ее модифицировать. Я бы предположил, что вы правы, что AutoMapper изменил код вокруг того, как они создают новый тип. Вместо этого используйте изменяемый экземпляр, например new List<T>() или T[].