【问题标题】:Entity Framework - how to create sql script with "GO" statements实体框架 - 如何使用“GO”语句创建 sql 脚本
【发布时间】:2014-08-18 23:02:19
【问题描述】:

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

update-database -script

这将为一个或多个迁移生成完整的 SQL 脚本。我们发现的问题是它没有为sql server生成所需的“GO”语句。这会导致 SQL 脚本在没有“-script”参数的情况下直接运行会成功时失败。

还有其他人遇到过这种情况吗?

【问题讨论】:

  • GO 不是 SQL 语句 - 它是 SQL Server Management Studio 使用的 分隔符 - 但它是特定于工具的功能,真的 - 不是 SQL 标准功能
  • @marc_s,我同意,但我将采用该 sql 脚本并在 mgmt studio 中运行它(我认为大多数其他人也会这样做)。你有没有想出更好的解决方案?
  • 这家伙似乎有一个可能的答案,但没有示例代码。 stackoverflow.com/questions/11548959/…
  • 您可以随时发表评论,询问该代码是否可以在某处下载...

标签: sql-server entity-framework


【解决方案1】:

您可以通过围绕 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);
    }
}

您还需要在配置类构造函数中将此类设置为 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 行,然后在准备好创建部署脚本时将其添加回来。

【讨论】:

    【解决方案2】:

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

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

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

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

    参考:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多