3

如果我尝试运行此代码

await _dbContext.Set<T>().ToListAsync();

我会收到这个错误:

InvalidOperationException:源 IQueryable 未实现 IDbAsyncEnumerable。只有实现 IDbAsyncEnumerable 的源才能用于实体框架异步操作。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=287068

按照提供的链接,我们可以阅读以下声明

[...] 因为它们仅设计用于实体框架,如果您尝试在不是实体框架查询的 LINQ 查询上使用它们,您可能会收到以下错误。

那为什么我不能在 DbSet 上使用它呢?对我来说,DbSet 显然是一个与实体框架相关的类,因为它可以在 EntityFramework 程序集中找到......

根据DbSet MSDN 文档,它实现了IDbAsyncEnumerable.GetAsyncEnumerator()。如果IDbAsyncEnumerable实现了,为什么不能.ToListAsync()运行?

另外,通过使用 ReSharper 反编译器深入研究代码,我无法理解它在什么时候出错了......AsDbAsyncEnumerable内部使用的方法试图将我的方法DbSet<T>转换成一个IDbAsyncEnumerable<T>应该可以工作的方法,因为DbSet它实现了它......

此时,我的代码使用以下行,这正是我期望.ToListAsync()在内部执行的操作。

await _dbContext.Set<T>().ToAsyncEnumerable().ToList();

为什么不ToAsyncEnumerable内部使用?如果它在 normal和 aToListAsync上都不起作用,将在哪种情况下使用?IQueryableDbSet

4

1 回答 1

2

Panagiotis Kanavos 和 Henk Holterman 在评论中指出了正确的事情:EF6 不是 EF Core。出于某种原因,我只是假设这两个是相同的,“核心”是一个用作别名的花哨名称。可能正是因为这个原因,我最终在我的项目中同时拥有这两者。

我尝试了很多方法来修复错误,但最终我通过简单地从我的项目中删除每个可能与实体框架或多或少远程相关的单个包来修复所有问题,除了Microsoft.NETCore.App因为它在 .netcote 2.0 应用程序中是强制性的。从那里我开始添加包,具体取决于编译器在使用 MSDN 查找包名时所使用的名称空间和类,它最终再次起作用。

现在正确回答我的问题:ToListAsync()完全按照它应该做的事情。它只是无法识别DbContextEF6,因为它不是 EFCore 包的一部分。因此,将这两者混为一谈并不是一个好主意。

于 2017-10-22T22:18:29.730 回答