2016-01-06 126 views
4

我使用Entity Framework在我的數據庫中執行存儲過程(Azure SQL Server)。實體框架:InvalidOperationException:操作無效。連接已關閉

我的C#代碼如下所示:

using (var context = new MyDataContext()) 
    numberOfEffectedRows = context.MySPName(this.Id); 

在執行的大多數情況下(99.9%),這工作正常。但是,有時它失敗與此錯誤:

System.InvalidOperationException: Invalid operation. The connection is closed. 
    at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) 
    at System.Data.SqlClient.SqlInternalTransaction.Rollback() 
    at System.Data.SqlClient.SqlInternalTransaction.Dispose(Boolean disposing) 
    at System.Data.SqlClient.SqlTransaction.Dispose(Boolean disposing) 
    at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
    at System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Dispose(DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Core.EntityClient.EntityTransaction.Dispose(Boolean disposing) 
    at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
    at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass4b.<ExecuteFunction>b__49() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
    at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction(String functionName, ObjectParameter[] parameters) 
    at ***.MyDataContext.MySPName(Nullable`1 Id) in *** 
    at ***.DoSomething() in *** 

當這種情況發生:

  1. 我不知道爲什麼它的發生。在我看來就像隨機化。
  2. 我不知道我的「MySPName」是否被執行。

有人知道爲什麼發生這種情況,我怎麼知道我的存儲過程是否被執行?

+0

是您粘貼的一個拋出異常的代碼片段? – neo

+0

是的。根據StackTrace的代碼行'context.MySPName(this.Id);'是例外的來源。 – No1Lives4Ever

+0

@ No1Lives4Ever確保在離開using語句之前枚舉查詢,EF使用延遲執行 –

回答

0

Linq查詢是懶惰評估的。查詢將在您第一次訪問numberOfEffectedRows時運行。由於您在創建數據上下文時使用了「使用」,因此一旦關閉範圍,它就會被丟棄。如果您訪問使用範圍之外的numberOfEffectedRows,則會發生這種情況,因爲如果沒有有效的數據上下文,查詢就無法運行。

+0

我的代碼中沒有LINQ。將值複製到「numberOfEffectedRows」按值「完成」。 – No1Lives4Ever

+0

我仍然認爲它與你的數據上下文創建使用語句有關,因爲堆棧跟蹤中的所有這些dispose方法調用,然後嘗試驗證連接。 – neo

1

被關閉的連接是由於超時,所以建議您檢查Connect Timeout連接字符串

connectionString="Data Source=..;Initial Catalog=;Persist Security Info=..;User ID=..;Password=..;Connect Timeout=.." 

對於診斷中,我建議你運行SQL Server Profiler

0

的EntityFramework上下文不是線程安全的,由於一些奇怪的原因,在執行期間數據上下文可能會被關閉。

處理這種驚喜的一種方法是每個請求都有一個上下文。

這是最簡單的解決方案,因此您將「希望」再也不會遇到此異常。

這裏

https://msdn.microsoft.com/en-us/library/microsoft.practices.unity.perrequestlifetimemanager(v=pandp.30).aspx

你可以做什麼檢查

container.RegisterType<IDataContext, MyDataContext>(new PerRequestLifetimeManager()); 

,然後你注入的DataContext你需要的地方訪問它。

這樣做,上下文將自動關閉容器時處置

相關問題