【问题标题】:Entity Framework Command Intercept change context connection string实体框架命令拦截更改上下文连接字符串
【发布时间】:2015-10-23 23:46:18
【问题描述】:

目标:

当主数据库无法访问/关闭时,回退到备份数据库。

当前实施:

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

  1. 在截获的上下文中关闭连接。
  2. 更改连接字符串。
  3. 打开连接。

这适用于 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多