无法将类型为'System.Data.ProviderBase.DbConnectionClosedConnecting'的对象转换为类型'System.Data.SqlClient.SqlInternalConnectionTds'

14
在应用程序启动后的第一次数据库访问时,我收到了以下错误信息 -“无法将类型为'System.Data.ProviderBase.DbConnectionClosedConnecting'的对象转换为类型'System.Data.SqlClient.SqlInternalConnectionTds'”。
该错误只在第一次尝试从数据库读取数据的方法时抛出,在应用程序启动后。 对于第二次及以后再调用相同的方法,一切正常。
使用Entity Framework和.NET Core 1.1。

这意味着在发送任何请求之前,您需要等待数据库连接。在开始查询数据库之前,您应该检查连接对象是否成功创建(并且没有抛出任何错误)。 - Burhan Khalid
谢谢@BurhanKhalid,希望您能指点我如何验证连接是否成功建立。 (我通过.NET Core DI注入了db上下文) - Egor
https://stackoverflow.com/help/mcve - mjwills
1个回答

9

最近我在使用ASP.NET Core 2和EF Core的应用程序中遇到了同样的异常。在我的情况下,根本原因是依赖注入的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>();
  }
}

因此,控制器将使用它的实例。如果单例服务也尝试使用自己的实例,那么大约90%的时间会出现上述错误。我不太清楚为什么会出现这个问题或是会间歇性发生,但在调试过程中很清楚,EF正在重复使用一些基础资源。我没有深入研究EF代码调试,但我怀疑控制器实例被关闭了,而服务实例则重用连接,并期望该连接保持打开状态。在阅读资料时,其他人建议在连接字符串中使用MultipleActiveResultSet=true可以解决此问题,但在我的情况下并没有解决该问题。在我的情况下,解决方案是将服务更改为Startup.cs中的Transient,这在这种情况下是可接受的,也可能更好:
services.AddTransient<TestService>(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接