【问题标题】:Flattening relational entities with AutoMapper使用 AutoMapper 展平关系实体
【发布时间】:2021-03-18 12:16:06
【问题描述】:

我在 EntityFramework 上下文中有以下情况:

class File {
   string FileName { get;set; }
   virtual ICollection<CaseFile> CaseFiles {get;set;}
}
class Case {
   string CaseRef { get;set; }
   virtual ICollection<CaseFile> CaseFiles {get;set;}
}
class CaseFile {
   virtual Case
   virtual File
}

我们正在设置 AutoMapper,但我们不想暴露 CaseFile 模型,我们的 ViewModel 如下:

class CaseViewModel {
   IEnumerable<FileViewModel> Files { get; set; }
}

AutoMapper 配置文件:

class CaseMappingProfile {
   public CaseMappingProfile() {
      CreateMap<Case, CaseViewModel>();
      CreateMap<File, FileViewModel>();
      CreateMap<CaseFile, FileViewModel>();
   }
}

现在,我真的找不到将 CaseFile 映射到 FileViewModel 并告诉 AutoMapper 使用 CaseFile.File 属性作为源的方法。我意识到我可以简单地这样做:

      CreateMap<CaseFile, FileViewModel>()
      .ForMember(dest => dest.Prop1, src => src.File.Prop1)
      .ForMember(dest => dest.Prop2, src => src.File.Prop2)
      .ForMember(dest => dest.Prop3, src => src.File.Prop3);

但 File 实体与许多其他实体相关联,而不仅仅是案例。 而且我不想为每个关系实体都这样做。

      CreateMap<CaseFile, FileViewModel>()
      .ForPath(dest => dest, src => src.File);

不允许,你需要定位一个目标成员,你不能定位模型本身。

【问题讨论】:

标签: entity-framework automapper


【解决方案1】:

我认为您不需要 CaseFile 的地图。

如果 CaseViewModel 将包含 FileViewModel 的集合,则:

CreateMap<File, FileViewModel>()
CreateMap<Case, CaseViewModel>()
    .ForMember(x => x.Files, opt => opt.MapFrom(src => src.CaseFiles.Select(c => c.File).ToList()));

如果 FileViewModel 没有 Cases Automapper 的集合,则应该将文件解析为 FileViewModel。如果其他区域需要文件视图模型/w Cases,那么您将需要分别用于 Case 和 File 的两个视图模型。一个带有子集合,一个没有。 IE。 CaseViewModel 包含 FileChildViewModel 的集合(未定义案例集合),而 FileViewModel 包含 CaseChildViewModel。 “child”风味不包括子集合本身作为子集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2019-04-29
    • 1970-01-01
    • 2021-02-19
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多