如果您对发布到SQL Server复制的表运行实体框架迁移(自动或显式),则会出现以下错误:
只能在读提交或可重复读隔离级别中指定READPAST锁定。
此前曾有相关问题(here),但它们完全未解决根本原因:实体框架迁移在Serializable隔离级别下运行(如SQL Server分析器中清晰显示)。
这是一个针对结构更改事务的安全选择,但它与发布的SQL Server表不兼容。与dbContext.SaveChanges()事务中使用的默认READ COMMITED SNAPSHOT级别不同,我尚未找到一种在代码中实际设置迁移的不同隔离级别的方法:
只能在读提交或可重复读隔离级别中指定READPAST锁定。
此前曾有相关问题(here),但它们完全未解决根本原因:实体框架迁移在Serializable隔离级别下运行(如SQL Server分析器中清晰显示)。
这是一个针对结构更改事务的安全选择,但它与发布的SQL Server表不兼容。与dbContext.SaveChanges()事务中使用的默认READ COMMITED SNAPSHOT级别不同,我尚未找到一种在代码中实际设置迁移的不同隔离级别的方法:
TransactionScope
(用于设置事务隔离级别的经典方法) 在Database.Initialize()
期间似乎被忽略了。最近引入的
Database.BeginTransaction(isolationLevel)
实际上在启动新事务之前尝试初始化数据库,因此不能使用。
已知的解决方法
将所有迁移生成为SQL脚本。这有效,但基于代码的迁移是我不想错过的强大工具。
使用显式迁移,并在每个
Up()
和Down()
方法中以以下方式开始:Sql("set transaction isolation level read committed");
这有效,但不方便且容易出错,因为开发人员通常不使用复制的数据库。