在EF 6.1中,您可以运行命令:
update-database -script
这会为一次或多次迁移生成完整的SQL脚本。我们发现的问题是它没有产生所需的" GO" sql server的语句。如果没有" -script"直接运行,这会导致SQL脚本失败。参数。
还有其他人遇到过这个吗?
答案 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'))
参考: