使用InMemoryDatabase时出现意外查询异常

时间:2019-11-12 18:20:34

标签: entity-framework-core entity-framework-core-3.0

我使用InMemoryDatabase进行了以下EF 3.0查询:

    IQueryable<Post> posts = _context.Posts.AsNoTracking();

    posts = posts.Where(x => x.Enabled);

    IQueryable<PostModel> models = null;

    try {

     models = jobs
      .Select(x => new PostModel {
        Id = x.Id,
        Enabled = x.Enabled,
        Category = x.Category == null ? null : new CategoryModel {
          Id = x.Category.Id,
          Name = x.Category.Name
        }
      );

      var result = await responses.ToListAsync();

    } catch (Exception e) {

       var ex = e;

    }

最初posts有2个项目。在过滤器Where(x => x.Enabled)之后,我得到了一项。

但是result末尾没有项目……似乎现有项目在投影中消失了。

然后我尝试了以下操作(已删除“类别”部分):

     models = jobs
      .Select(x => new PostModel {
        Id = x.Id,
        Enabled = x.Enabled
      );

      var result = await responses.ToListAsync();

现在结果有一个预期的项目...

有什么主意吗?我真的迷失了这个。

1 个答案:

答案 0 :(得分:0)

这个问题很难识别,我正在发布解决方案,该解决方案将来可能对其他人有用...

Post模型配置Category中,属性/关系设置为必需

当我向context添加帖子时,其中一个错误地将Category设置为null

如果我使用的是SQL Server,则在保存上下文时会出现错误。

但是因为我正在执行测试并且正在使用InMemoryDatabase,所以接受了无效的帖子。

这导致了查询中真正奇怪的错误...

结论:

在EF 3.0(及更低版本)中,该模型未在C#级别进行验证。
因此,在使用InMemoryDatabase时,将保存错误的模型,并导致查询中发生意外错误。

Entity Framework Core 3.0中还有一个Github问题: https://github.com/aspnet/EntityFrameworkCore/issues/10613