Sql server 2008 &引用;基础提供程序在打开时失败";实体框架错误

Sql server 2008 &引用;基础提供程序在打开时失败";实体框架错误,sql-server-2008,entity-framework,sql-server-express,Sql Server 2008,Entity Framework,Sql Server Express,我一直收到错误“基础提供程序在打开时失败”。最近,我一直在努力找出原因。仔细检查错误时,内部异常为“连接未关闭。连接的当前状态为连接”。堆栈跟踪为 "at System.Data.ProviderBase.DbConnectionClosedConnecting.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, D

我一直收到错误“基础提供程序在打开时失败”。最近,我一直在努力找出原因。仔细检查错误时,内部异常为“连接未关闭。连接的当前状态为连接”。堆栈跟踪为

"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 Edition
  • Visual Studio 2012
  • MVC Web API\Asp.net MVC 4
  • 实体框架5
我的数据层根据存储库模式建模,并通过结构图注入

存储库

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();
    }
public class MyContextFactor : IDbContextFactory<MyContext>, IDisposable
{
    private MyContext _dataContext;

    public MyContextFactor Create()
    {
        return _dataContext ?? (_dataContext = new MyContext());
    }

    public void Dispose()
    {
        _dataContext.Dispose();
    }
}
公共类存储库:IDisposable,IRepository其中T:class
{
私有只读数据库集_DbSet;
私有只读dbcontextu DbContext;
公共存储库(IDbContextFactory dbContextFactory)
{
_dbContext=dbContextFactory.Create();
_dbSet=_dbContext.Set();
}
//为了简洁而去掉
公共空间处置()
{
_dbContext.Dispose();
}
DbContextFactory

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();
    }
public class MyContextFactor : IDbContextFactory<MyContext>, IDisposable
{
    private MyContext _dataContext;

    public MyContextFactor Create()
    {
        return _dataContext ?? (_dataContext = new MyContext());
    }

    public void Dispose()
    {
        _dataContext.Dispose();
    }
}
公共类MyContextFactor:IDbContextFactory,IDisposable
{
私有MyContext_dataContext;
公共MyContextFactor创建()
{
返回_dataContext??(_dataContext=new MyContext());
}
公共空间处置()
{
_Dispose();
}
}
国际奥委会结构图注册表

For(typeof(IDbContextFactory<MyContext>)).HybridHttpOrThreadLocalScoped().Use(typeof(MyContextFactory));
For(typeof(IDbContextFactory)).hybridhtttporthreadlocalscope().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=&quot;data source=(local);initial catalog=MyDB;User Id=SQLUser;Password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>

我试图解决这个问题,但到目前为止还没有成功

  • 通过结构映射作用域确保上下文是每个http上下文
  • 已将dispose添加到存储库
  • 已将dispose添加到ContextFactory
  • 从集成Sql身份验证切换到Sql身份验证

这原来是一个正在缓存的ActionFilterAttribute。ActionFilterAttribute有一个实体框架上下文,该上下文未被正确处理,正在跨请求共享。

如果使用DbContext,则连接字符串不应该是实体连接字符串,而应该是常规连接字符串。我不知道连接字符串中的元数据指向什么,因为DbContext没有edmx或csdl、ssdl、msl文件形式的工件。通常在安装SqlExpress时,数据源是。\SqlExpress,但在您的情况下是“data source=(local)”-没有SqlExpress实例(如果您真的这样安装它,可能没问题)。请尝试使用Sql Server Management studio连接到您的数据库,当您成功使用connstringI中的相同数据时,我遇到了相同的问题,这是Sql Server身份验证问题,正如@Pawel所说,请尝试使用Management studio或Visual studio中的数据库资源管理器连接到服务器。如何处置ActionFilterAttribute. ?