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)。在不为接口的每个具体实现创建映射的情况下,我是否错过了能够执行此投影的东西?

谢谢!

Automapper项目从接口到混凝土类

我在评论中提出了问题,但还没有得到回应,但我很确定这是你的问题,所以我会继续回答。

您正在创建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(),你应该会很好。