我已经搜索了这几天了,似乎没有任何工作,我正在使用c#MVC实体框架与Automapper和我试图实现下面的ViewModels(主要是LostDocumentVM)从我的数据库映射,所有其他属性将在控制器中设置。
这是我的ViewModels ......
DocumentVM
{
Public Enum.HistoricType HistoricType {get;set;}
Public DocumentChildVM Document { get; set;}
}
DocumentChildVM
{
Public bool ShowHistoricLink {get;set;}
Public IEnumerable<ListDocumentVM> DocumentsToReview {get;set;}
}
ListDocumentVM
{
Public int Id {get;set;}
Public string Name {get; set;}
Public DateTime? ReviewDate {get;set;}
}
我像这样初始化DocumentVM ......
DocumentVM documentVM = DataContext.SystemUser.Where(x=>x.SustemUserID==LoggedOnUserID).Project().To<DocumentVM>().SingleOrDefault();
我的映射就是这样......
Mapper.CreateMap<SystemUser,DocumentVM>()
.ForMember(dest=>dest.Document.DocumentsToReview, opt=>opt.MapFrom(src=>src.Documents.Where(x=>x.DocumentType == Enum.DocumentType.Assessment));
我是AutoMapper的新手,并努力让更高级的映射工作。
答案 0 :(得分:1)
是的,您的ForMember会员必须引用目的地类型的会员,而您的会员指的是儿童类型的会员。相反,您需要创建一个填充该子实体的此信息的AfterMap函数。
这并不难,但你有一个奇怪的设置,其中子对象Document具有来自父DocumentVM上另一个属性的属性DocumentsToReview:
documentVM.Document.DocumentsToReview =
src.Documents.Where(doc => doc.DocumentType == Enum.DocumentType.Assessment);
当你必须在兄弟/侄子成员之间改变数据时,它会变得更具挑战性。
使用AfterMap执行此操作:
Mapper.CreateMap<SystemUser, DocumentVM>()
.AfterMap((src, dest) => dest.Document.DocumentsToReview =
src.Documents.Where(doc => doc.DocumentType == Enum.DocumentType.Assessment));