automapper返回空列表,但反射工作正常

时间:2018-01-31 18:38:01

标签: c# automapper

我正在从数据读取器中读取并想要自动化到对象列表中,但是当它使用基本反射工作正常时,我总是使用Automapper获得一个空列表。

这是我使用反射的代码:

List<T> res = new List<T>();
using (var cmd = new OleDbCommand("Select ID, THP, Parent FROM Node_DP", conn))
            {
                conn.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    if(reader.HasRows)
                    {
                     while (reader.Read())
                     {
                        T t = new T();

                        for (int inc = 0; inc < reader.FieldCount; inc++)
                        {
                            Type type = t.GetType();
                            PropertyInfo prop = type.GetProperty(reader.GetName(inc));
                            prop.SetValue(t, reader.GetValue(inc), null);
                        }

                        res.Add(t);
                    }
                  }
                }
            }

使用automapper我执行以下操作:

        var config = new MapperConfiguration(cfg =>
          {
              cfg.CreateMap<DbDataReader, List<T>>();
          });

        var res2 = iMapper.Map<DbDataReader, List<T>>(reader);

[编辑] 我下载了Automapper.Data包并将我的代码更改为:

        var config = new MapperConfiguration(cfg =>
          {
              cfg.AddDataReaderMapping();
              cfg.CreateMap<DbDataReader, List<T>>();
          });

我的类具有与select语句具有相同大小写的实例变量。

有什么问题?

1 个答案:

答案 0 :(得分:1)

从4.0开始,核心软件包中删除了对DataReader内容的自动映射的支持,并移至Automapper.Data。看看操作方法。

修改 这是Northwind数据库的工作示例代码:

public class Category
{
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
}
public class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(cfg =>
        {
            cfg.AddDataReaderMapping();                
            cfg.CreateMap<IDataReader, Category>();
        });

        using (var conn = new SqlConnection(@"Data Source=(localdb)\mssqllocaldb;Initial Catalog=Northwind;Integrated Security=True"))
        using (var cmd = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories", conn))
        {
            conn.Open();
            using (var reader = cmd.ExecuteReader())
            {                    
                var res2 = Mapper.Map<IDataReader, List<Category>>(reader);
            }
        }            
    }
}