我正在从数据读取器中读取并想要自动化到对象列表中,但是当它使用基本反射工作正常时,我总是使用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语句具有相同大小写的实例变量。
有什么问题?
答案 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);
}
}
}
}