我遇到了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?
答案 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
现在,当我创建部署包并将其发布到服务器时,DLL始终存在于bin文件夹中,并且映射可以正常工作。
希望这有助于某人。感谢大家的指导!