Automapper项目从接口到混凝土类
本文关键字:混凝土 接口 项目 Automapper | 更新日期: 2023-09-27 17:58:43
我正试图使用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&Name)。在不为接口的每个具体实现创建映射的情况下,我是否错过了能够执行此投影的东西?
谢谢!
我在评论中提出了问题,但还没有得到回应,但我很确定这是你的问题,所以我会继续回答。
您正在创建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(),你应该会很好。