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

问题描述 投票:0回答:2

我想将数据表映射到模型。我使用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;
 }

问题

enter image description here

我错过了什么?

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

c# unit-testing datatable nunit automapper
2个回答
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)


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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.