Pau*_*Jan 16 c# sql-server entity-framework ef-migrations entity-framework-6
如果针对为SQL Server复制发布的表运行实体框架迁移(自动或显式),则会出现以下错误:
您只能在READ COMMITTED或REPEATABLE READ隔离级别中指定READPAST锁
之前(此处)存在一些问题,但它们完全无法解决根本原因:实体框架迁移在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");
这有效,但由于开发人员通常不使用复制数据库,因此不方便且容易出错.
小智 21
是否有助于创建您的onw Migrator?
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4590 次 |
| 最近记录: |