实体框架命令拦截更改上下文连接字符串



进球:

当主数据库不可达/down时,回退到备份数据库。

当前实现:

当检测到问题时,使用实现IDbCommandInterceptor的类将连接字符串更改为备用服务器。

  1. 关闭拦截上下文的连接。
  2. 改变connectionstring。
  3. 打开连接。

对于 readerexecution 可以正常工作,但是对于 nonqueryexecution 则不行。我可以看到到备用服务器的连接是打开的,看起来很好,但是在context期间,我得到了以下内容。

底层提供程序提交失败。

InnerException: Value不能为空。参数名称:connection

更新:在对此进行了更多的研究之后,我发现问题发生在由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()

改变连接字符串的正确位置是实现IDbConnectionInterceptor接口的Opening()。这适用于简单的读、写和事务。实现IDbCommandInterceptor成员对于处理单个sql命令行为的完整解决方案非常有用。

最新更新