Ego*_*gor 5 .net c# entity-framework asp.net-core
我在应用程序启动后的第一个数据库访问时收到以下错误 - "无法将类型为'System.Data.ProviderBase.DbConnectionClosedConnecting'的对象强制转换为类型'System.Data.SqlClient.SqlInternalConnectionTds"
该错误仅抛出一次,在第一个方法尝试在应用程序启动后从数据库中读取数据.第二次重新调用相同的方法,进一步,一切正常.
使用.net核心1.1与实体框架
我最近在带有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)
| 归档时间: |
|
| 查看次数: |
2464 次 |
| 最近记录: |