2015-10-23 26 views
2

目標實體框架指令攔截變化背景下的連接字符串

回落到備份數據庫時,最主要的是不可達/向下。

當前實現

檢測到問題,當

,使用類實現IDbCommandInterceptor改變連接字符串備用服務器。

  1. 關閉截取上下文的連接。
  2. 更改連接字符串。
  3. 打開連接。

這正常工作與ReaderExecuting,但不與NonQueryExecuting。我可以看到的後備服務器的連接是開放的,看起來不錯,但我得到在context.SaveChanges(以下)

基礎提供失敗的提交。

InnerException:值不能爲空。參數名:連接

UPDATE: 看起來有點多地進入這個後,我看到的問題是通過調用SaveChanges創建的事務中發生()。上下文關閉連接導致在提交時由事務對象拋出異常。我無法找到更改此事務的連接或連接字符串的方式。在ConnectionGetting()中使用IDbTransactionInterceptor處理它並在上下文中創建新的事務並沒有幫助,它仍然繼續嘗試提交(可能是競爭條件,而不是這樣做的好辦法)。 ChangeDatabase()似乎不起作用,因爲連接應該在同一臺服務器上。

所以現在的問題是:有沒有辦法改變現有交易的連接/連接字符串?

堆棧跟蹤:

at System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName) 
at System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection(DbConnection connection) 
at System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Commit(DbTransaction transaction, DbInterceptionContext interceptionContext) 
at System.Data.Entity.Core.EntityClient.EntityTransaction.Commit() 
+0

答案很可能一直在臉上一直盯着我:System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection(DbConnection連接) – Levent

回答

1

的正確的位置來改變連接字符串是在實施開口() IDbConnectionInterceptor接口。這適用於簡單的讀取,寫入和交易。 實現IDbCommandInterceptor成員在處理單個sql命令行爲時對於完整的解決方案很有用。

相關問題