[Ef Core][.Net][C#] AutoMapper ProjectedTo() 不同结果 Map<>() “序列不包含元素”

问题描述 投票:0回答:1

我使用 Automapper 工作了一年,没有出现重大问题。 现在,我向 DbModel 和 Models 文件之一添加了另一个字段,引用另一个字段。 基本上:

class Blog { ...  public BlogCreationRequest? creationRequest = null;}  // same dto field
class BlogCreationRequest { ...  public Blog? blog? = null;}  // same dto field

在数据库中,只有CreationRequest实体有外键(可为空)

我创建了准系统配置文件,并对 dbContext 文件中的关系进行了映射。 现在的问题是: 当通过 linq 使用 ProjectTo 方法获取时,我在运行时收到“序列不包含元素”异常。当像 _mapper.Map() 这样在内存中获取和映射时,它可以毫无问题地进行映射(尽管更深层次的数据也需要包括其他字段)。我使用 FirstAsync 进行获取,在它之前创建要获取和返回的实体(成功)。 在没有 ProjectTo 的情况下测试 fetch 也可以。我在映射之前获得原始条目,并且可以在之后显式映射。

我该如何调试这个,可能是什么问题?表达式树似乎是正确的,模仿了与其他可能为空的可选关系相同的表达式。 我尝试检查配置文件(BeforeMap 或某物,尽管不是广泛),空检查不会执行任何操作。像空一样改变可选性!也没有帮助。

c# .net entity-framework automapper
1个回答
0
投票

ProjectTo() 的问题可能是由 EF Core 将可为空关系转换为 SQL 的方式引起的。以下是修复/调试的方法:

使用.Include()来确保相关实体已加载:

var blog = await _context.Blogs
    .Include(b => b.CreationRequest)
    .ProjectTo<BlogDto>(_mapper.ConfigurationProvider)
    .FirstAsync();

检查 AutoMapper 配置文件是否可以为空关系:

CreateMap<Blog, BlogDto>()
    .ForMember(dest => dest.CreationRequest, opt => opt.MapFrom(src => src.CreationRequest));

记录 SQL 查询以查看 EF Core 生成的内容:

var query = _context.Blogs.ProjectTo<BlogDto>(_mapper.ConfigurationProvider);
Console.WriteLine(query.ToQueryString());

如有必要,回退到 Map():

var blog = await _context.Blogs.Include(b => b.CreationRequest).FirstAsync();
var blogDto = _mapper.Map<BlogDto>(blog);

这应该有助于诊断和解决 ProjectTo() 的问题。

© www.soinside.com 2019 - 2024. All rights reserved.