2012-10-31 35 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

相關問題