我想将数据表映射到模型。我使用AutoMapper来完成这项工作。我用NUnit编写了单元测试。这就是我做到的
该模型
public class DataTableModelTest
{
public int Dosage { get; set; }
public string Drug { get; set; }
}
映射器方法
class MapperClass{
public IList<TResultType> MapToModel<TResultType>(DataTable datatable)
{
AutoMapper.Mapper.Reset();
AutoMapper.Mapper.CreateMap<IDataReader, IList<TResultType>>();
var re = AutoMapper.Mapper.Map<IDataReader, IList<TResultType>>(datatable.CreateDataReader());
return re;
}
}
Mapper的单元测试
[Test]
public void TestTheJob() // don't mind the method name
{
const int expectedListCount = 3;
var dataTables = GetDataTable();
var mapperClass = new MapperClass();
var result = mapperClass.MapToModel<DataTable>(dataTables);
Assert.AreEqual(expectedListCount, result.Count);
}
数据表getter ..这包含在单元测试中
public DataTable GetDataTable()
{
var dataTable = new DataTable();
dataTable.Columns.Add("Drug", typeof(string));
dataTable.Columns.Add("Dosage", typeof(int));
dataTable.Rows.Add("Indocin", 25);
dataTable.Rows.Add("Enebrel", 50);
dataTable.Rows.Add("Hydralazine", 10);
return dataTable;
}
问题
我错过了什么?
仅供参考:我正在使用最新的稳定版AutoMapper 6.1.1和NUnit版本3.8.1
您正在创建IDataReader
和IList<TResultType>
之间的映射,如下所示:
AutoMapper.Mapper.CreateMap<IDataReader, IList<TResultType>>();
但是你将DataTable
映射到`IList
试着改变这个......
AutoMapper.Mapper.CreateMap<IDataReader, IList<TResultType>>();
对此
AutoMapper.Mapper.CreateMap<DataTable, IList<TResultType>>();
请参阅MSDN文档以获取DataTable类以查看此类型的继承树:https://msdn.microsoft.com/en-us/library/system.data.datatable(v=vs.110).aspx
此外,AutoMapper默认情况下不知道如何在DataTable列和类型属性之间执行映射。您必须明确定义这些映射。请参考这个SO答案,了解如何实现这个Using AutoMapper to Map a DataTable to an Object (DTO)
而不是使用Automapper ...我通过引用这个SO使用了反射
public IList<TResultType> MapDataTableToType<TResultType>(DataTable dataTable) where TResultType : class, new()
{
var list = new List<TResultType>();
foreach (var row in dataTable.AsEnumerable())
{
var obj = new TResultType();
foreach (var prop in obj.GetType().GetProperties())
{
var propertyInfo = obj.GetType().GetProperty(prop.Name);
if (propertyInfo != null)
propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
}
list.Add(obj);
}
return list;
}
}