映射IDataReader时不会调用AutoMapper TypeConverter

时间:2014-07-28 21:20:12

标签: c# .net automapper idatareader

我想使用AutoMapper映射一些模型。 Automapper设置为从IDataReader映射到模型类。问题是我需要在我的mapper上设置一个ITypeConverter,以便我可以为每个模型枚举有限的次数。 我不想为每个模型创建许多继承自ITypeConverter的类。

示例模型:

public class Customer: IModel
{
    public FirstName { get; set; }
    public LastName { get; set; }
}

Mapper类:

public static class AutoMappingConfig
{
    public static void Configure()
    {
        // I would have many other mappings like the one below. All taking an IDataReader and mapping to a model inheriting from IModel
        Mapper.CreateMap<IDataReader, Customer>()
            .ForMember(x => x.FirstName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("first_name")))
            .ForMember(x => x.LastName, o => o.MapFrom(s => s.GetString(s.GetOrdinal("last_name"))));

        // I would have many of the following. All taking an IDataReader and mapping to an IEnumerable model object
        Mapper.CreateMap<IDataReader, IEnumerable<Customer>>().ConvertUsing<ModelConverter<Customer>>();
    }
}

转换器:

public class ModelConverter<T>: ITypeConverter<IDataReader, IEnumerable<T>> where T: IModel
{
    public IEnumerable<T> Convert(ResolutionContext context)
    {
        var dataReader = (IDataReader) context.SourceValue;
        var rowCount = 0;
        var collection = new List<T>();

        // The purpose for this ModelConverter is the a maximum row count of 10
        while (dataReader.Read() && rowCount < 10)
        {
            var item = Mapper.Map<IDataReader, T>(dataReader);
            collection.Add(item);
            rowCount++;
        }

        return collection;
    }
}

注意:问题不在于ModelConverter类,因为当我传入IDataReader时它永远不会被调用。我尝试了一个与另一个类相似的映射系统,它被调用并成功处理映射。

当我运行以下代码时,返回的值是具有空映射的项列表。根本不会调用ModelConverter类。以上代码适用于除IDataReader之外的任何输入。 AutoMapper正在使用IDataReader做一些特别的事情,但我不知道如何继续使用ITypeConverter。

var customers = Mapper.Map<IDataReader, IEnumerable<Customer>>(dataReader);

在上面的代码中,dataReader是IDataReader对象。

1 个答案:

答案 0 :(得分:0)

目前,数据阅读器不支持类型转换器,抱歉。