ASP.NET MVC Core 和实体框架中的 ToListAsync 不起作用
Posted
技术标签:
【中文标题】ASP.NET MVC Core 和实体框架中的 ToListAsync 不起作用【英文标题】:ToListAsync in ASP.NET MVC Core and Entity Framework not working 【发布时间】:2016-12-23 17:19:31 【问题描述】:我在 ASP.NET MVC Core 和 Entity Framework 中有以下代码,当我执行 ToListAsync
时出现以下错误。
附加信息:源 IQueryable 未实现 IDbAsyncEnumerable。仅来源 实现 IDbAsyncEnumerable 可用于实体框架 异步操作。有关更多详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=287068.
这是我的代码:
var states = mDbContext.State.ToListAsync();
var countries = mDbContext.Country.ToListAsync();
mMemoryCache.Set(Countries, await countries,
new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.MaxValue));
mMemoryCache.Set(States, await states,
new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.MaxValue));
我的上下文类从 DbContext
扩展而来,我使用的是 EF 6。
public virtual DbSet<Country> Country get; set;
public virtual DbSet<State> State get; set;
知道为什么即使我已经安装了所有东西,我也无法执行ToListAsync()
?
【问题讨论】:
你的代码真的是public virtual DbSet State get; set;
吗?
是的,在继承自 DbContext 的上下文类中。
您使用的是哪个数据库?也许是 mysql?
不,MS SQL 服务器
1) 您在 project.json 中使用的是哪个 .net 框架? 2) 你是否在你的控制器/类中添加了System.Data.Entity;
?
【参考方案1】:
ToListAsync()
在System.Data.Entity
和Microsoft.EntityFrameworkCore
中都定义了。如果您同时导入两者,它将默认为 System.Data.Entity 中的定义,生成上述错误。删除System.Data.Entity
并添加尝试使用Microsoft.EntityFrameworkCore
添加;
【讨论】:
这应该是一条评论,因为它没有回答问题,也没有解释为什么这样做会有所帮助。 具有讽刺意味的是,它帮助我解决了一个不相关的问题 +1 这个答案也为我解决了完全相同的“IQueryable 没有实现 IDbAsyncEnumerable”错误。我希望 MS 在组织他们的库方面更聪明,或者至少在添加 EfCore 后创建了更多有用的错误消息.. 这帮助我将 ASP.NET 4.5 项目转换为 .NET Core 3.0 基本上使用ToList()
需要using System.Linq;
,使用ToListAsync()
需要using Microsoft.EntityFrameworkCore;
【参考方案2】:
EF6 != EF 核心。它们在一定程度上功能相似,但不兼容。
ToListAsync 是 EF Core 功能,您正尝试在 EF6 DbContext 上使用它。
这就是它不起作用的原因。如果您想使用此功能,您必须使用 EF Core DbContext - 但是您可能再次在代码的其他地方使用 EF6 功能,而这些功能将停止工作。
【讨论】:
以上是关于ASP.NET MVC Core 和实体框架中的 ToListAsync 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用trackerenableddbcontext在asp.net mvc5和代码中的实体框架中实现审计跟踪
基于 ASP.NET Core 中的现有数据库创建实体框架模型
ASP.NET 5/ASP.NET Core 1 中的关注点分离和 n 层架构