gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:20:18 24 4
gpt4 key购买 nike

应用程序启动后第一次访问数据库时出现以下错误 - “无法将类型为‘System.Data.ProviderBase.DbConnectionClosedConnecting’的对象转换为类型‘System.Data.SqlClient.SqlInternalConnectionTds’

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

将 .net core 1.1 与 Entity Framework 结合使用

最佳答案

我最近在使用 EF Core 的 ASP.NET Core 2 应用程序中遇到了同样的异常。在我的例子中,根本原因是我的依赖注入(inject) DbContext 的范围有问题。我有一个 Controller 和一个服务,它们都使用注入(inject)的 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>();
}
}

所以 Controller 会使用它的实例,然后如果单例服务也尝试使用它自己的实例,那么它会在大约 90% 的时间内给出错误。我不太清楚为什么这会成为一个问题,或者是间歇性的,但在调试过程中很明显 EF 正在重用一些底层资源。我没有深入研究 EF 代码调试,但我怀疑 Controller 实例已关闭,而服务实例重用了连接,期望它是打开的。在阅读中,其他人建议连接字符串中的 MultipleActiveResultSet=true 可以修复,但这并没有解决我的问题。在我的例子中,修复是在 Startup.cs 中将服务更改为 Transient,这在这种情况下是可以接受的,并且可能更好:

services.AddTransient<TestService>(); 

关于c# - 无法将类型为 'System.Data.ProviderBase.DbConnectionClosedConnecting' 的对象转换为类型“System.Data.SqlClient.SqlInternalConnectionTds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46138168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com