我希望确保在Server中打开特定的功能。我目前正在使用EF6迁移来生成更改脚本。我使用了针对Server 2012和Server 4的迁移(用于映射的基本单元测试)。Server不支持我要启用的特定功能。
如何创建仅适用于Server的迁移?
以下是问题中的迁移:
public partial class EnableSnapshotIsolation : DbMigration
{
public override void Up()
{
Sql(@" ALTER DATABASE CURRENT
SET READ_COMMITTED_SNAPSHOT ON", true);
Sql(@" ALTER DATABASE CURRENT
SET ALLOW_SNAPSHOT_ISOLATION ON", true);
}
public override void Down()
{
Sql(@" ALTER DATABASE CURRENT
SET READ_COMMITTED_SNAPSHOT OFF", true);
Sql(@" ALTER DATABASE CURRENT
SET ALLOW_SNAPSHOT_ISOLATION OFF", true);
}
}备注:我们手动部署更改脚本的。一个人打开一个SSMS窗口并执行脚本。作为构建打包过程的一部分,我使用更新数据库-script命令提供了一个更改脚本。所以EF没有创建数据库。
发布于 2015-11-20 17:55:45
经过相当多的摸索之后,我发现在迁移过程中没有办法阻止基于数据库类型的迁移。但是,您可以实现自己的migrator for a specific provider。
我的解决方案包括像这样更新配置类。
public class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = "Data\\Migrations";
SetSqlGenerator("System.Data.SqlClient", new SqlMigrator());
}
private class SqlMigrator : SqlServerMigrationSqlGenerator
{
public override IEnumerable<MigrationStatement> Generate(
IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken)
{
var statements = new List<MigrationStatement>
{
new MigrationStatement
{
Sql = "ALTER DATABASE CURRENT SET READ_COMMITTED_SNAPSHOT ON",
SuppressTransaction = true
},
new MigrationStatement
{
Sql = "ALTER DATABASE CURRENT SET ALLOW_SNAPSHOT_ISOLATION ON",
SuppressTransaction = true
}
};
statements.AddRange(base.Generate(migrationOperations, providerManifestToken));
return statements;
}
}
}注意:在2012年之前的Server版本中,当然会失败,所以让您的脚本像设置这些标志所需要的那样强大。这适用于我的特殊情况。
https://stackoverflow.com/questions/33831728
复制相似问题