实体框架 - 如何使用" GO"创建sql脚本。声明

时间:2014-08-06 13:51:54

标签: sql-server entity-framework

在EF 6.1中,您可以运行命令:

update-database -script

这会为一次或多次迁移生成完整的SQL脚本。我们发现的问题是它没有产生所需的" GO" sql server的语句。如果没有" -script"直接运行,这会导致SQL脚本失败。参数。

还有其他人遇到过这个吗?

2 个答案:

答案 0 :(得分:5)

您可以通过在SqlServerMigrationSqlGenerator类周围创建包装类来覆盖脚本生成行为。此类包含一个重载的Generate()方法,该方法接受表示其生成的脚本块类型的参数。您可以在启动新脚本块之前覆盖这些方法以添加“GO”语句。

public class ProdMigrationScriptBuilder : SqlServerMigrationSqlGenerator
{
    protected override void Generate(HistoryOperation insertHistoryOperation)
    {
        Statement("GO");
        base.Generate(insertHistoryOperation);
        Statement("GO");
    }

    protected override void Generate(CreateProcedureOperation createProcedureOperation)
    {
        Statement("GO");
        base.Generate(createProcedureOperation);
    }

    protected override void Generate(AlterProcedureOperation alterProcedureOperation)
    {
        Statement("GO");
        base.Generate(alterProcedureOperation);
    }

    protected override void Generate(SqlOperation sqlOperation)
    {
        Statement("GO");
        base.Generate(sqlOperation);
    }
}

您还需要在Configuration类构造函数中将此类设置为Sql Generator。

    public Configuration()
    {
        AutomaticMigrationsEnabled = false;

       // Add back this line when creating script files for production migration...
       SetSqlGenerator("System.Data.SqlClient", new ProdMigrationScriptBuilder());

    }

这种方法的一个问题是,虽然它非常适合为SQL Server企业管理器创建可重用的脚本文件,但GO语句在本地执行迁移时不起作用。您可以在本地工作时注释掉SetSqlGenerator行,然后在准备好创建部署脚本时将其添加回来。

答案 1 :(得分:1)

如果您尝试使用Sql('Alter View dbo.Foos As etc')更改视图,则可以避免使用

  

应该是批处理文件错误中的第一个语句

通过将sql放在EXEC命令中而不添加GO语句:

Sql(EXEC('Alter View dbo.Foos As etc'))

参考:

https://stackoverflow.com/a/20352867/150342