使用 AutoMapper 扁平化关系实体

Flattening relational entities with AutoMapper

我在 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);

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

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

如果 CaseViewModel 将包含 collection 个 FileViewModel,则:

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

假设 FileViewModel 没有 collection 个案例,Automapper 应该将文件解析为 FileViewModel。如果其他区域需要文件视图模型 /w 案例,那么您将分别需要两个视图模型用于案例和文件。一个有 child collection,一个没有。 IE。 CaseViewModel 包含 collection 个 FileChildViewModel(未定义 collection 个案例),而 FileViewModel 包含 CaseChildViewModel。 “child”风格将 child collection 排除在外,以充当 children 本身。