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

Unexpected query exception when using InMemoryDatabase

我有以下使用 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();

现在结果有一项符合预期...

知道哪里出了问题吗?我真的迷失了这一点。

这个问题很难确定,我正在 post 解决方案,将来可能对其他人有用...

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

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

如果我使用的是 SQL 服务器,我会在保存上下文时遇到错误。

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

这导致了查询中非常奇怪的错误...

结论:

在 EF 3.0(和以前的版本)中,模型未在 C# 级别进行验证。
因此,当使用 InMemoryDatabase 时,错误的模型将被保存并导致查询中出现意外错误。

Entity Framework Core 3.0 中也存在 Github 问题: https://github.com/aspnet/EntityFrameworkCore/issues/10613