我正在尝试使用Automapper'Project'方法在EF域对象和DTO对象之间执行映射,但在尝试从接口投影到具体类时遇到问题。我的EF域对象实现了一个我常用于查找表的接口:
public interface ILookupItem
{
int Id { get; set; }
string Name { get; set; }
}
这是我的域对象的一个例子:
public partial class ReportType : ILookupItem
{
public int Id { get; set; }
public string Name { get; set; }
}
在我的应用中,我正在使用与域对象接口完全匹配的DTO对象:
public class LookupItemModel
{
public static void CreateMapping(IConfiguration configuration)
{
configuration.CreateMap<ILookupItem, LookupItemModel>();
}
public int Id { get; set; }
public string Name { get; set; }
}
然后我通过以下调用执行数据库查询:
return DbContext.Query<ReportType>().Project().To<LookupItemModel>();
然而,在此调用中,Automapper给出了一个错误,即错过了执行该函数所需的映射:
Missing map from ReportType to LookupItemModel. Create using Mapper.CreateMap<ReportType, LookupItemModel>.
我会假设可以从界面执行映射,因为它需要知道的是为(Id&amp; Name)提取数据的属性。我是否遗漏了能够执行此投影但没有为我的界面的每个具体实现创建地图的东西?
谢谢!
答案 0 :(得分:1)
我在评论中提出但尚未得到答复,但我很确定这是你的问题,所以我会继续做出答案。
您正在创建ILookupItem和LookupItemModel之间的映射,但您并没有调用创建地图的方法 - LookupItemModel.CreateMapping()
。
在进行映射之前,您需要调用此方法:
LookupItemModel.CreateMapping(your IConfiguration);
return DbContext.Query<ReportType>().Project().To<LookupItemModel>();
那就是说,我不是在你的模型中设置你的映射逻辑,而是创建一个AutoMapper配置类来设置你的所有地图。类似的东西:
public class AutoMapperConfig {
public static CreateMaps() {
CreateLookupItemMaps();
}
public static CreateLookupItemMaps() {
Mapper.CreateMap<ILookupItem, LookupItemModel>();
}
}
或者更简洁的做法是使用AutoMapper Profiles
然后在应用启动期间调用AutomapperConfig.CreateMaps(),你应该很好。