无法投类型的对象System.Data.ProviderBase.DbConnectionClosedConnecting为键入"System.Data.SqlClient.SqlInternalConnectionTds

Ego*_*gor 5 .net c# entity-framework asp.net-core

我在应用程序启动后的第一个数据库访问时收到以下错误 - "无法将类型为'System.Data.ProviderBase.DbConnectionClosedConnecting'的对象强制转换为类型'System.Data.SqlClient.SqlInternalConnectionTds"

该错误仅抛出一次,在第一个方法尝试在应用程序启动后从数据库中读取数据.第二次重新调用相同的方法,进一步,一切正常.

使用.net核心1.1与实体框架

Dan*_*iel 5

我最近在带有EF Core的ASP.NET Core 2应用程序中遇到了相同的异常。就我而言,根本原因是依赖项注入的DbContext的范围存在问题。我有一个控制器和一个服务都使用注入的DbContext。该服务是一个单例,如下所示:

public class TestService{
  public TestService(FooDbContext db)
    {
        this.db = db;
    }
}

public class FooController{
 public FooController(FooDbContext db, TestService testService) 
 {
        this.testService = testService;
        this.db = db;
 }
}
public class Startup{
  public void ConfigureServices(IServiceCollection services){
      //...
      services.AddDbContext<FooDbContext>(options =>
            options
            .UseSqlServer(Configuration.GetConnectionString("FooDbContext"))
      );
      services.AddSingleton<TestService>();
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,控制器将使用它的实例,然后,如果单例服务也尝试使用它自己的实例,那么它将在大约90%的时间内给出错误。对于这将是一个问题还是断断续续的原因,我有点模糊,但是在调试中很明显,EF正在重用某些基础资源。我没有深入研究EF代码调试,但我怀疑控制器实例已关闭,并且服务实例重用了该连接,并期望它是打开的。在阅读中,其他人建议连接字符串中的MultipleActiveResultSet = true可以解决,但是在我的情况下,这不能解决问题。就我而言,解决方法是将Startup.cs中的服务更改为Transient,在这种情况下可以接受,并且可能更好:

services.AddTransient<TestService>(); 
Run Code Online (Sandbox Code Playgroud)