c# - Automapper嵌套实体配置最佳实践

标签 c# entity-framework-core automapper

我正在使用 Automapper 将一些嵌套的 EF 类扁平化为包含所有相关属性的 DTO,以及用于本地化查找的字典。 请参阅下面的示例代码。

实体类:

public class DbClass
{
  public int PropA { get; set; }
  
  public DbDetails Details { get; set; }
}
public class DbDetails
{
  public int PropB { get; set; }
  public ICollection<DbResource> Resources { get; set; }
}
public class DbResource
{
  public string Language { get; set; }
  public string DisplayText { get; set; }
}

DTO 类:

public class DTO
{
  public int PropA { get; set; }
  public int PropB { get; set; }

  /// Lookup by language code
  public IDictionary<string, string> DisplayText { get; set; }
}

自动映射器配置:

CreateMap<DbClass, DTO>().IncludeMembers(c => c.Details);
CreateMap<DbDetails, DTO>().IncludeMembers(d => d.Resources);
CreateMap<ICollection<DbResource>, IDictionary<string, string>>()
    .ConstructUsing(src => src.ToDictionary(r => r.Language, r => r.DisplayText));
CreateMap<ICollection<DbResource>, DTO>()
    .ForMember(dest => dest.DisplayText, opts => opts.MapFrom(src => src));

我是自动映射器的新手,但这似乎工作正常。

我的问题是,是否有更清晰或更简洁的方法来定义所需的映射?

最佳答案

在 AutoMapper 中当然有多种方法可以完成同样的事情。这里有几个更精简的选项,可以更直接地处理 DbDetails.Resources

CreateMap<DbClass, DTO>()
    .IncludeMembers(dest => dest.Details);
CreateMap<DbDetails, DTO>()
    .ForMember(dest => dest.DisplayText, opt => opt.MapFrom(src => src.Resources));
CreateMap<ICollection<DbResource>, IDictionary<string, string>>()
    .ConstructUsing(src => src.ToDictionary(r => r.Language, r => r.DisplayText));

如果您不需要重用上面最后一个映射(即它仅在映射 DbDetails -> DTO 的上下文中使用),则配置可以缩短为:

CreateMap<DbClass, DTO>()
    .IncludeMembers(dest => dest.Details);
CreateMap<DbDetails, DTO>()
    .ForMember(dest => dest.DisplayText, 
        opt => opt.MapFrom(src => src.Resources.ToDictionary(r => r.Language, r => r.DisplayText)));

关于c# - Automapper嵌套实体配置最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72493867/

相关文章:

c# - Entity Framework Core DbUpdateException 详细信息

Java 类型-细化映射

c# - 表不继承 css 到控制台应用程序中的电子邮件 Html 模板

c# - WinForms TreeView - 如何手动 "highlight"节点(就像它被点击一样)

c# - DllNotFoundException:libzmq

c# - 使用C#计算PDF文档中减号的数量

c# - 将 DBSet 集合作为 bson 文档插入到 Mongodb

c# - 使 EF Core 2 使用仅 getter 属性,无需支持字段

c# - ASP.NET MVC 中独立项目 IoC 中的 AutoMapper 相同配置文件类

c# - 如何将 ProjectTo 从基本类型转换为仅在运行时已知的类型?