【问题标题】:Automapper Project From Interface to Concrete Class从接口到具体类的 Automapper 项目
【发布时间】:2014-05-31 18:23:59
【问题描述】:

我正在尝试使用 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 和名称)提取数据的属性。我是否遗漏了一些能够在不为我的接口的每个具体实现创建地图的情况下执行此投影的东西?

谢谢!

【问题讨论】:

  • 您是否曾经在 LookupItemModel 上调用过 CreateMapping()?

标签: c# entity-framework automapper


【解决方案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(),您应该会很好。

【讨论】:

  • 对不起,我应该在最初的描述中包含这个。我的模型上的“CreateMapping”方法被称为 Automapper 的 IoC 配置的一部分。在应用程序启动时,我使用反射来查找项目中所有类型的所有静态“ConfigureMapping”方法并执行每个找到的方法。我更喜欢以这种方式组织模型的配置,因为当我构建/更新模型时,所有相关的映射配置都在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多