我一直在收到错误“底层提供程序在打开时失败”。最近,我一直在试图找出原因。仔细检查错误,内部异常是“连接未关闭,连接当前状态正在连接”。和堆栈跟踪是“底层提供程序在打开时失败”实体框架错误
"at System.Data.ProviderBase.DbConnectionClosedConnecting.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)"
据我可以告诉错误似乎随机发生或可能在更改应用程序时发生。任何帮助将不胜感激。
我目前的设置是
- IIS快递
- 的Microsoft SQL Server Express版本
- 的Visual Studio 2012
- MVC的Web API \ Asp.net MVC 4
- 实体框架5
我的数据层是在Repository pa ttern并通过结构图注入。
库
public class Repository<T> : IDisposable, IRepository<T> where T : class
{
private readonly DbSet<T> _dbSet;
private readonly DbContext _dbContext;
public Repository(IDbContextFactory<MyContext> dbContextFactory)
{
_dbContext = dbContextFactory.Create();
_dbSet = _dbContext.Set<T>();
}
//removed for brevitity
public void Dispose()
{
_dbContext.Dispose();
}
DbContextFactory为国际奥委会
public class MyContextFactor : IDbContextFactory<MyContext>, IDisposable
{
private MyContext _dataContext;
public MyContextFactor Create()
{
return _dataContext ?? (_dataContext = new MyContext());
}
public void Dispose()
{
_dataContext.Dispose();
}
}
结构映射注册表
For(typeof(IDbContextFactory<MyContext>)).HybridHttpOrThreadLocalScoped().Use(typeof(MyContextFactory));
连接字符串
<add name="MyContextConnectionString" connectionString="metadata=res://*/Model.MyProject.csdl|res://*/Model.MyProject.ssdl|res://*/Model.MyProject.msl;provider=System.Data.SqlClient;provider connection string="data source=(local);initial catalog=MyDB;User Id=SQLUser;Password=****;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
事情我已经试图解决这个问题,至今还没有制定
- 确保环境是每HTTP上下文通过结构图范围
- 添加到处置版本库
- 将ContextFactory添加到配置
- 从集成的Sql auth切换到Sql身份验证
如果您使用DbContext,则您的连接字符串不应该是实体连接字符串,而应该是常规连接字符串。我不知道从连接字符串指向什么元数据,因为使用DbContext时,没有edmx或csdl,ssdl,msl文件形式的工件。通常当你安装SqlExpress时,数据源是。\ SQLEXPRESS,但在你的情况下,它是“数据源=(本地)” - 没有SQLEXPRESS实例(如果你真的像这样安装它可能会好)。尝试使用Sql Server Management Studio连接到您的数据库,并且当您成功在您的连接字符串中使用相同的数据时 – Pawel
我有同样的问题,它是SQL服务器身份验证问题,并且像@Pawel说的那样,尝试使用Management Studio连接到服务器或来自Visual Studio的数据库浏览器。 –