DataTable to List - AutoMapperException或Values不会映射

时间:2015-05-26 22:53:27

标签: c# .net datatable automapper

我遇到了AutoMapper(3.3.1)的问题。我有两个查询,一个返回一个Entity Framework对象的列表,另一个返回一个DataTable。原因是我们需要从这些查询返回不同的数据/结果。我想将这两个映射到同一个对象模型,但我遇到了奇怪的行为。根据我走的路线(见下文),我要么得到一个AutoMapper异常,要么我的列表中根本没有得到任何值。我们有多个对象可以做到这一点,并且很高兴知道正确的设置是什么。

情景1

// this function runs on application_start
public static void ConfigureMapping() {
    // ...
    AutoMapper.Mapper.CreateMap<SubObjectClassModel, LUSubObjectClass>();
        AutoMapper.Mapper.CreateMap<LUSubObjectClass, SubObjectClassModel>()
            .ForMember(x => x.ObjectClassCode,
                y => y.MapFrom(x => x.LUObjectClass.Code))
            .ForMember(x => x.ObjectClassGroupCode,
                y => y.MapFrom(x => x.LUObjectClass.GroupCode));

    AutoMapper.Mapper.CreateMap<IDataReader, SubObjectClassModel>();
}

public static List<SubObjectClassModel> Gets()
    {
        LUSubObjectClass subObjectClass = new LUSubObjectClass();
        return Mapper.Map<IDataReader, List<SubObjectClassModel>>(
            subObjectClass.Gets().CreateDataReader()
        );
    }

在服务器上运行它总是给我这个例外:

Missing type map configuration or unsupported mapping. Mapping types: IDataReader -> List`1 System.Data.IDataReader -> System.Collections.Generic.List`1[[BRS.Models.Common.SubObjectClassModel, BRS.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] Destination path: List`1 Source value: System.Data.DataTableReader

场景2 我尝试了这篇文章中概述的解决方案:http://www.geekytidbits.com/automapper-with-datatables/但是当我在服务器上运行它时,我得到一个空列表。

在这种情况下,我不会在我的ConfigureMapping fx中创建这个映射,只是第一个:

AutoMapper.Mapper.CreateMap<IDataReader, SubObjectClassModel>();

我也试过这个:

    AutoMapper.Mapper.CreateMap<IDataReader, List<SubObjectClassModel>>();

正确的方法是什么?

修改 这是一些奇怪的行为。如果我不重建我的整个项目(特别是具有Configure调用的项目),我要么得到automap异常,要么没有结果。如果我重建一切,我会得到结果。然后,当我部署到服务器时,我得到异常或没有结果。

编辑2

经过进一步调查,我注意到以下情况。当我从VS运行而不重建整个解决方案时,我看到Mapper.Map调用后没有返回任何结果,我看到所有映射都正确列出。但是,Automappers.Mapper.DataReaderMapper未列在AutoMapper.ConfigurationStore下。

成功返回结果后,通常在重建解决方案后,会列出此映射器。

导致该行为的原因是什么?我如何确保每次都加载DataReaderMapper?

1 个答案:

答案 0 :(得分:0)

我与AutoMapper团队进行了交谈,它基本上归结为未加载的DLL(https://github.com/AutoMapper/AutoMapper.Data/issues/11)。有问题的DLL是AutoMapper.Net4.dll。我将AutoMapper安装为NuGet包,并且没有任何不允许加载此DLL的项目设置。

所以我按照这篇文章中的步骤进行了操作:How can I force .NET to use a local copy of an assembly that's in the GAC

  1. 将缺少的DLL添加到项目中,并将依赖项作为链接文件。
  2. 在文件属性Copy To Output Directory上,选择If Newer。
  3. 现在,当我创建部署包并将其发布到服务器时,DLL始终存在于bin文件夹中,并且映射可以正常工作。

    希望这有助于某人。感谢大家的指导!