这是AutoMapper 2.0.0和2.2.0之间的重大变化吗?

时间:2012-11-21 20:36:56

标签: c# collections ienumerable automapper automapper-2

我今天从AutoMapper 2.0.0更新到2.2.0,并意识到更新破坏了一些代码。想在autpperpper github网站上发布问题之前在这里询问一下。

我的一个目标类型初始化一个集合属性,如下所示:

public class PageOf<TModel>
{
    public PageOf()
    {
        Items = Enumerable.Empty<TModel>();
    }

    public IEnumerable<TModel> Items { get; set; }
}

使用automapper 2.0.0,这很好。当我更新到2.2.0时,映射到此目标类型会导致NotSupportedException,并显示消息“Collection is a fixed size”。 (该异常包含在AutoMapperMappingException中。)

我能够通过将上面的构造函数代码更改为:

来解决问题
public PageOf()
{
    Items = new List<TModel>();
}

似乎AutoMapper 2.0.0正在丢弃Items属性中的任何值并使用set属性访问器,而AutoMapper 2.2.0只是使用get属性访问器并尝试修改现有的IEnumerable。看起来Enumerable.Empty<TModel>()只是替换零长度数组,这将解释异常。

这是一个错误吗? AutoMapper在2.0.0和2.2.0之间的变化会导致它忽略目标属性设置器,而是尝试修改现有的集合?

更新

根据要求,这是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

如果AutoMapper中从2.0.0到2.2.0需要特殊的映射配置(for example .ConvertUsing(x => x)),我们可能需要挂起旧版本。我总是喜欢AM如何自动转换集合属性,没有它,AM看起来更像是ValueInjecter。

2 个答案:

答案 0 :(得分:1)

您是否尝试过以下方式使用Map方法: Mapper.Map<DestinationClass, SourceClass>(object to convert)

使用2.2版本的AutoMapper,这就是我们使用它的方式,它适用于我们。

答案 1 :(得分:0)

我猜它正在尝试添加到您的集合中,但由于您的集合是一个只读实例(Enumerable.Empty<T>),因此无法实际修改它。我认为你是正确的,AutoMapper改变了他们实例化新类型的代码。请使用可变实例,例如new List<T>()T[]