Automapper.ProjectTo() 抛出空引用异常

时间:2021-01-25 08:30:56

标签: entity-framework-core automapper ef-core-3.1 automapper-10

我有以下映射:

        CreateMap<PeopleForm, FormDto>()
            .ForMember(des => des.Code, src => src.MapFrom(s => s.Code))
            .ForMember(des => des.Notes, src => src.MapFrom(s => s.FormNotes))
            //other mappings removed for breivity
            ;

        CreateMap<FormNote, NoteDto>()
            .ForMember(x => x.Note, cfg => cfg.MapFrom(y => y.Note));

我想查询它:

        var query = _context.PeopleForms.Where(i => i.Id == id);
        var form = await _mapper.ProjectTo<FormDto>(query).FirstOrDefaultAsync();-->NullReferenceException

但是当我注释掉从 FormNotes 到 Notes 的映射时它有效:

        CreateMap<PeopleForm, FormDto>()
            .ForMember(des => des.Code, src => src.MapFrom(s => s.Code))
            //.ForMember(des => des.Notes, src => src.MapFrom(s => s.FormNotes))--> this line is the problem
             ;

而且,我想出的解决方案是在映射中进行选择:

                .ForMember(des => des.Notes, src => src.MapFrom(s => s.FormNotes.Select(n=> new 
                 NoteDto{Note = n.Note})))

我检查了日志,似乎问题主要与 Ef 核心有关:

             Microsoft.EntityFrameworkCore.Query: Error: An exception occurred while iterating over 
             the results of  a query for context type 'Backend.Infrastructure.MolsaContext'.

我该怎么办?我有另一个表(实体)的精确映射,它没有问题,唯一的问题是这个特定的映射。

我错过了什么?与 AutoMapper 或 Ef 核心有关吗?

1 个答案:

答案 0 :(得分:0)

所以这是我的错误,FormNote 和 NoteDto 的导航属性名称相同导致了 null 。

CreateMap<FormNote, NoteDto>()
.ForMember(x => x.Note, cfg => cfg.MapFrom(y => y.Note))
.ForMember(x => x.LastModifiedAt, cfg => cfg.MapFrom(y => y.LastModifiedById != null ? y.ModifiedDate.Value.ToString("yyyy-MM-dd HH:m:s") : null))
.ForMember(x => x.CreatedAt, cfg => cfg.MapFrom(y => y.CreatedDate.ToString("yyyy-MM-dd HH:m:s")))

.ForMember(x => x.CreatedBy, cfg => cfg.MapFrom(y => y.CreatedBy.FullName))
.ForMember(x => x.LastModifiedBy, cfg => cfg.MapFrom(y => y.LastModifiedById != null? y.LastModifiedBy.FullName : null));
相关问题