首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将EF6迁移定位为仅在Server上执行?

如何将EF6迁移定位为仅在Server上执行?
EN

Stack Overflow用户
提问于 2015-11-20 16:39:50
回答 1查看 500关注 0票数 0

我希望确保在Server中打开特定的功能。我目前正在使用EF6迁移来生成更改脚本。我使用了针对Server 2012和Server 4的迁移(用于映射的基本单元测试)。Server不支持我要启用的特定功能。

如何创建仅适用于Server的迁移?

以下是问题中的迁移:

代码语言:javascript
复制
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没有创建数据库。

EN

回答 1

Stack Overflow用户

发布于 2015-11-20 17:55:45

经过相当多的摸索之后,我发现在迁移过程中没有办法阻止基于数据库类型的迁移。但是,您可以实现自己的migrator for a specific provider

我的解决方案包括像这样更新配置类。

代码语言:javascript
复制
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版本中,当然会失败,所以让您的脚本像设置这些标志所需要的那样强大。这适用于我的特殊情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33831728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档