C#Automapper嵌套对象

时间:2014-07-08 08:32:04

标签: c# automapper

我已经搜索了这几天了,似乎没有任何工作,我正在使用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的新手,并努力让更高级的映射工作。

1 个答案:

答案 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));