AutoMapper:此平台不支持代理生成

时间:2017-10-23 12:22:30

标签: c# unit-testing datatable nunit automapper

我想将数据表映射到模型。我使用AutoMapper来完成这项工作。 我用NUnit编写了单元测试。我就这样做了

模型

public class DataTableModelTest
{
    public int Dosage { get; set; }
    public string Drug { get; set; }
}

Mapper方法

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;
 }

问题

enter image description here

我错过了什么?

仅供参考:我使用最新的稳定版AutoMapper 6.1.1和NUnit版本3.8.1

2 个答案:

答案 0 :(得分:1)

您正在IDataReaderIList<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)

答案 1 :(得分:0)

而不是使用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;
    }
}