ExecuteDeleteAsync 在内存数据库上引发错误 [重复]

ExecuteDeleteAsync throws error on inmemory db [duplicate]

提问人:KnApP993 提问时间:10/12/2023 最后编辑:KnApP993 更新时间:10/12/2023 访问量:96

问:

我正在实现最新的 ef core 7 功能 ExecuteDeleteAsync()。从那以后,我的测试失败了。但是正在使用真正的 MsSql Server。我正在使用内存数据库,我不确定这是否由于以下语句而不起作用:

但是,在不涉及更改跟踪器的情况下对数据库执行更新或删除命令有时很有用。EF7 使用新的 ExecuteUpdate 和 ExecuteDelete 方法实现此目的。这些方法应用于 LINQ 查询,并将根据该查询的结果更新或删除数据库中的实体。

内存数据库中是Microsoft.EntityFrameworkCore.InMemory及其最新版本。

public async Task<int> DeleteWhere(Expression<Func<T, bool>> predicate)
{
  var amount = await _dbSet.Where(predicate).ExecuteDeleteAsync();
  return amount;
}

这是我的数据库上下文:

 public DashboardDbContext CreateDashboardContext()
    {
        var dbName = $"xUnitTest{_instanceCount++}";
        var builder = new DbContextOptionsBuilder<DashboardDbContext>();

        builder.UseInMemoryDatabase(dbName);

        return new DashboardDbContext(builder.Options);
    }

例外:

{“LINQ 表达式 'DbSet()\r\n
.其中(b => b.ModifiedTime < __dateToKeepData_0)\r\n .ExecuteDelete()' 无法翻译。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038

C# 实体框架 内存中数据库 ef-core-7.0

评论

0赞 nvoigt 10/12/2023
磕磕绊绊你正在使用的内存数据库,以及你得到的确切错误消息会很有用。请注意,这些命令绕过了更改跟踪,如果在之前或之后使用 EF 更改跟踪,则可能会导致更改跟踪中断。
0赞 KnApP993 10/12/2023
@nvoigt我添加了更多数据

答:

0赞 nvoigt 10/12/2023 #1

假设是模型中的 DateTime 字段,并且正确表示数据库,并且是代码中的本地 DateTime 变量,它应该可以工作。ModifiedTimedateToKeepData

但请注意,不应将 InMemory 数据库用于单元测试。引用Microsoft自己的话:

虽然某些用户使用内存中数据库进行测试,但不建议这样做。

您可以使用其他内存数据库,例如 SQLite。这应该有效。我在我的代码中做了一些工作,并且使用SQLite它可以正常工作。也许是时候听从微软的警告并切换到适当的内存数据库了,而不仅仅是微软的模拟版本。

评论

0赞 KnApP993 10/12/2023
我认为事实并非如此。我找到了其他帖子,它说:这些新的扩展仅适用于关系提供程序。InMemory 不是关系提供程序。stackoverflow.com/questions/74907256/......