2012-11-26 75 views
2

我在使用實體框架連接到我的數據庫時遇到問題。試圖連接到數據庫時,我隨機得到以下錯誤...EntityException:底層提供程序在打開時失敗

EntityException: The underlying provider failed on Open. 
The connection was not closed. The connection's current state is connecting. 

爲了給你我的設置,我使用MVC 4和Ninject一些背景。我還使用this article中描述的存儲庫和工作單元模式。我使用的是默認NinjectWebCommon文件中的MVC 4,我的RegisterServices方法如下...

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IMyEntities>().To<MyEntities>(); 
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
    // UnitOfWork has a dependency on MyEntities 

    kernel.Bind<IAccountManager>().To<AccountManager>(); 
    kernel.Bind<ITransactionManager>().To<TransactionManager>(); 
    // AccountManager and TransactionManager has a dependency on UnitOfWork 
} 

我的頁面加載罰款,但我有導致錯誤頁面上2所AJAX調用。當ajax調用被刪除時,錯誤不會發生。當只有1個ajax調用發生時,錯誤不會發生。只有兩個呼叫同時發生時纔會發生錯誤。

這裏有2個不同的網頁API控制器...

public class AccountController : ApiController 
{ 
    private readonly IAccountManager _AccountManager; 

    public AccountController(IAccountManager accountManager) 
    { 
     _AccountManager = accountManager; 
    } 

    public HttpResponseMessage Get() 
    { 
     IEnumerable<Account> accounts = _AccountManager.Get(); 
     return Request.CreateResponse(HttpStatusCode.OK, accounts); 
    } 
} 

public class TransactionController : ApiController 
{ 
    private readonly ITransactionManager _TransactionManager; 

    public TransactionController(ITransactionManager transactionManager) 
    { 
     _TransactionManager = transactionManager; 
    } 

    public HttpResponseMessage Get() 
    { 
     IEnumerable<Transaction> transactions = _TransactionManager.Get(); 
     return Request.CreateResponse(HttpStatusCode.OK, transactions); 
    } 
} 

我真不知道這裏做什麼。我已閱讀每篇關於StackOverflow和Google的文章,但找不到答案。有沒有人知道我能做些什麼來阻止這個問題的發生?

+0

基礎上下文的位置和生命週期的位置並不完全清楚,但您必須確保兩個控制器都有自己的上下文。現在看起來,一個控制器可以解決上下文問題,而另一個控制器在第一個控制器仍然忙時也是如此。 –

+0

我有完全相同的問題,沒有使用事務(TransactionScope類)似乎已經暫時解決了我的問題。我還沒有弄清楚TransactionScope確實會毀掉連接。 –

回答

0

我有同樣的問題,最終我發現相同的UnitOfWork實例正在從不同的線程訪問。我對Ninject不是很熟悉,但我建議檢查您的Account和TransactionManager,確保它們正在訪問UnitOfWork的不同實例。

+0

這聽起來像是發生在我身上的事情。當你發現從不同的線程訪問同一個UnitOfWork時,你做了什麼來解決它? –

+0

我使用Unity容器進行DI目的,並且錯誤地將一組實例提供給Repositories的解析器。所以我每解決一個存儲庫它有相同的常量UnitOfWork,在我的情況下也是相同的ObjectContext。最後,我將UnitOfWork實例的創建移到了我的Repository類中,因此我從未遇到過任何問題。 –

相關問題