2012-10-31 40 views
3

我一直在收到错误“底层提供程序在打开时失败”。最近,我一直在试图找出原因。仔细检查错误,内部异常是“连接未关闭,连接当前状态正在连接”。和堆栈跟踪是“底层提供程序在打开时失败”实体框架错误

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

事情我已经试图解决这个问题,至今还没有制定

  • 确保环境是每HTTP上下文通过结构图范围
  • 添加到处置版本库
  • 将ContextFactory添加到配置
  • 从集成的Sql auth切换到Sql身份验证
+0

如果您使用DbContext,则您的连接字符串不应该是实体连接字符串,而应该是常规连接字符串。我不知道从连接字符串指向什么元数据,因为使用DbContext时,没有edmx或csdl,ssdl,msl文件形式的工件。通常当你安装SqlExpress时,数据源是。\ SQLEXPRESS,但在你的情况下,它是“数据源=(本地)” - 没有SQLEXPRESS实例(如果你真的像这样安装它可能会好)。尝试使用Sql Server Management Studio连接到您的数据库,并且当您成功在您的连接字符串中使用相同的数据时 – Pawel

+0

我有同样的问题,它是SQL服务器身份验证问题,并且像@Pawel说的那样,尝试使用Management Studio连接到服务器或来自Visual Studio的数据库浏览器。 –

回答

3

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

+0

如何处置ActionFilterAttribute。 ? – Niks

相关问题