c# - 如何为 Entity Framework Code First 迁移设置隔离级别

标签 c# sql-server entity-framework entity-framework-6 entity-framework-migrations

如果您针对为 SQL Server 复制发布的表运行 Entity Framework 迁移(自动或显式),您会收到以下错误:

You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels

之前有过关于此的问题(here),但它们完全未能解决根本原因:Entity Framework 迁移在 Serializable 隔离级别运行 (如 SQL Server 探查器中清楚显示的那样)。

这是结构更改事务的安全选择,但它与已发布的 sql server 表不兼容。与 dbContext.SaveChanges() 事务中使用的默认 READ COMMITED SNAPSHOT 级别不同,我还没有找到一种方法来实际为代码中的迁移设置不同的隔离级别:

  • TransactionScope(为事务设置隔离级别的经典方法)似乎在 Database.Initialize()

  • 期间被忽略
  • 最近引入的 Database.BeginTransaction(isolationLevel) 实际上是在开始新事务之前尝试初始化数据库,因此不能使用。

已知解决方法

  1. 将所有迁移生成到 SQL 脚本。这行得通,但基于代码的迁移是一种强大的工具,我不想错过。

  2. 使用显式迁移,并使用类似的东西启动每个 Up()Down() 方法

    Sql("设置事务隔离级别读提交");

这可行,但不方便且容易出错,因为开发人员通常不使用复制的数据库..

最佳答案

创建您自己的迁移器是否有帮助?

internal sealed class Configuration : DbMigrationsConfiguration<SupplierEntities>
{
  public Configuration()
  {
    SetSqlGenerator("System.Data.SqlClient", new SqlMigrator());
  }

  private class SqlMigrator : SqlServerMigrationSqlGenerator
  {
    public override IEnumerable<MigrationStatement> Generate(
      IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken)
    {
      yield return new MigrationStatement { Sql = "set transaction isolation level read committed" };
      foreach (var statement in base.Generate(migrationOperations, providerManifestToken))
        yield return statement;
    }
  }
}

关于c# - 如何为 Entity Framework Code First 迁移设置隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127647/

相关文章:

c# - GnuTLS 错误 -110 : The TLS connection was non-properly terminated

c# - 如何绑定(bind)剑道网格

sql-server - 对 SSRS 中的一列表达式求和

c# - 在 Entity Framework 中使用动态 where 子句

c# - LINQ 表达式包含对与不同上下文关联的查询的引用

c# - 为什么 EF 急切地首先使用 EF 数据库加载所有导航属性?

c# - 以对象列表作为属性的 MVC 模型

sql - SQL 查询速度慢,不知道如何优化

c# - 在SQL中选择TOP行,得到5行尾表

c# - 带有 Entity Framework 的多对多插入的 TransactionScope 返回 TimeoutException