【发布时间】:2015-10-23 23:46:18
【问题描述】:
目标:
当主数据库无法访问/关闭时,回退到备份数据库。
当前实施:
当检测到问题时,使用实现IDbCommandInterceptor的类将连接字符串更改为备用服务器。
- 在截获的上下文中关闭连接。
- 更改连接字符串。
- 打开连接。
这适用于 ReaderExecuting,但不适用于 NonQueryExecuting。我可以看到与备用服务器的连接已打开并且看起来很好,但在 context.SaveChanges() 期间我得到以下信息:
底层提供程序在提交时失败。
InnerException: 值不能为空。参数名称:连接
更新: 在对此进行更多研究后,我发现问题发生在由 SaveChanges() 创建的事务中。关闭上下文连接会导致事务对象在提交时抛出异常。我找不到更改此事务的连接或连接字符串的方法。使用 IDbTransactionInterceptor 在 ConnectionGetting() 中处理它并在上下文中创建新事务并没有帮助,它仍然会继续尝试提交(可能是竞争条件,无论如何都不是这样做的好方法)。 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()
【问题讨论】:
-
答案很可能一直盯着我看:System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection(DbConnection connection)
标签: entity-framework-6 connection-string interceptor