使用 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 本身。
我在 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 本身。