EF Core的间歇性错误:连接不支持MultipleActiveResultSets

时间:2017-09-04 09:00:40

标签: asp.net-core entity-framework-core azure-sql-database

我有一个使用EF Core的ASP.Net Core应用程序。

我使用ASP.Net Identity并为我的应用程序实体共享相同的DBContext。

我已将连接字符串设置为Azure SQL数据库,以使MultipleActiveResultSet = True。

它可以工作一两天,但最终会因错误而失败:

  

该连接不支持MultipleActiveResultSets。

我不认为MARS是真正的问题,因为它在前两天起作用了。

我正在使用ASP.Net Core的内置DI来设置我的DbContext。

services.AddDbContext<AppDbContext>(options =>
  options.UseSqlServer(appDbContextConnectionString));

我的理解是上面的DbContext的默认生命周期是Transient(每个Web请求)。

与ASP.Net Identity共享相同的DBContext是否可以,或者我应该为我的应用程序的实体分别使用一个DBContext,指向相同的数据库?

我不知道这是EF Core,ASP.Net Core还是SQL Azure配置的问题。

5 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我发现问题是我错过了方法前的await语句。

FetchStuffFromDBAsync();

蜜饯:

await FetchStuffFromDBAsync();

问题消失了。

答案 1 :(得分:1)

MultipleActiveResultSets =确实需要添加连接字符串。

string connectionString =“数据源= MSSQL1;初始目录= AdventureWorks;集成安全性= SSPI; MultipleActiveResultSets = True”;

答案 2 :(得分:1)

  

多个活动结果集(MARS)是可与SQL一起使用的功能   服务器允许一次执行多个批处理   连接。启用MARS与SQL Server一起使用时,每个命令   使用的对象将会话添加到连接中。

默认情况下,MARS功能处于禁用状态。

您可以按如下所示启用它。

string connectionString = "Data Source=MSSQL1;" +   
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +  
    "MultipleActiveResultSets=True";  

Special Considerations When Using MARS

答案 3 :(得分:0)

我也一直遇到这个问题,在连接字符串中设置MultipleActiveResultSet=True没有做太多。

Startup.cs中的我的数据库配置与您的配置非常相似:

 services.AddEntityFrameworkSqlServer()
         .AddDbContext<MyDbContext>(options =>
           options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
            builder => builder.MigrationsAssembly("MyProject")),
            ServiceLifetime.Transient
         );

原来我得到了

  

该连接不支持MultipleActiveResultSets

因为我有几个异步数据库查询访问相同的实体。因此,一个db查询将检索一个实体,第二个将通过EF Core的新Include方法包含相同的实体。另请参阅https://stackoverflow.com/a/46164203/4336725

我有几个异步数据库查询的原因是因为EF Core目前不支持延迟加载(与EF 6不同)。 https://github.com/aspnet/EntityFrameworkCore/issues/3797

我的解决方法是使用不同的显式IQueryableInclude()定义多个ThenInclude()

答案 4 :(得分:0)

从连接字符串中删除“连接超时”设置。