【问题标题】:automapper returning empty list but reflection works fine自动映射器返回空列表但反射工作正常
【发布时间】:2018-07-10 23:33:44
【问题描述】:

我正在从数据阅读器读取数据并希望自动映射到对象列表中,但是虽然使用基本反射可以正常工作,但使用 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);
                    }
                  }
                }
            }

使用自动映射器我执行以下操作:

        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 语句相同。

怎么了?

【问题讨论】:

    标签: c# automapper


    【解决方案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);
                }
            }            
        }
    }
    

    【讨论】:

    • 文档有点缺乏:) 你能提供一些代码吗?我添加了 nuget 数据包 Automapper.Data(天哪,它添加了一些文件和配置!),添加了 cfg.AddDataReaderMapping();到我的“新 MapperConfiguration”行,我仍然得到 0 行。然后我将它放入单独的“Mapper.Initialize”调用中,但没有奏效。我能看到的唯一文档是 .md 文件中的一行代码,仅此而已。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2021-10-28
    • 2017-10-02
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多