加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

实体框架 – EF5迁移 – 丢弃约束时重复/重定义变量bug使用SQL G

发布时间:2020-12-12 16:35:48 所属栏目:MsSql教程 来源:网络整理
导读:背景: 我们有一个使用ef-migrations的项目,其中包含长时间开发中创建的多个(read?60)迁移.当然这些迁移也涉及到: drop constraints1,2 创建触发器 当我们跑步时,都是独角兽和彩虹 Update-Database 因为每个迁移作为单独的批次运行.但是使用这些迁移创建SQL
背景:

我们有一个使用ef-migrations的项目,其中包含长时间开发中创建的多个(read?60)迁移.当然这些迁移也涉及到:

> drop constraints1,2
>创建触发器

当我们跑步时,都是独角兽和彩虹

Update-Database

因为每个迁移作为单独的批次运行.但是使用这些迁移创建SQL脚本时

Update-Database -Script

我们遇到了一些问题,如下所述:

问题1:

在多个迁移文件中删除多个约束时,EF生成的脚本往往会重新声明其用于删除的变量.这是因为它确保了同一迁移文件中的变量名称的唯一性,但是在更改文件时,会重置计数器,从而重叠名称.

问题二:

SQL强制CREATE TRIGGER始终是批处理中的第一个语句.当脚本生成时,EF忽略Sql(“CREATE TRIGGER …”)的内容;因此不特别对待它.因此,该语句可能出现在脚本文件的中间,并出错.

解决方案:(或者我们以为!)

这两个问题的常见/常识解决方案是在正确的位置插入开始/结束sql批处理.手动这样做会使我成为一个非常有钱的人,所以这不是一个有效的解决方案.

相反,我们使用了technique provided by @DavidSette.创建一个从SqlServerMigrationSqlGenerator继承的新的BatchSqlServerMigrationSqlGenerator,它有效地覆盖了dropColumnOperation和sqlOperation,然后强制围绕敏感的一个GO语句:

protected override void Generate (System.Data.Entity.Migrations.Model.DropColumnOperation dropColumnOperation)
{
    base.Generate(dropColumnOperation);
    Statement("GO");
}

嘘嘘:

此解决方案中断运行Update-Database而不使用-Script标志,并显示以下错误:

System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'GO'.

这是由我们的定制生成器添加的.现在我不知道为什么,但应该有一个很好的理由EF不认识GO!

更多信息:

> Migrations: Duplicate @var0 variables in script that drops two constraints
> The variable name ‘@number’ has already been declared
> How can I override SQL scripts generated by MigratorScriptingDecorator
> Entity Framework Migrations: Including Go statement only in -Script output

全错误:

Applying code-based migration: 201205181406363_AddTriggerForOverlap.
GO
System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'GO'.
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection,Action`1 wrapCloseInAction)
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception,Action`1 wrapCloseInAction)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)
    at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout)
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite)
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
    at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction,MigrationStatement migrationStatement)
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction,MigrationStatement migrationStatement)
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
    at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId,XDocument targetModel,IEnumerable`1 operations,Boolean downgrading,Boolean auto)
    at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration,DbMigration lastMigration)
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration,DbMigration lastMigration)
    at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations,String targetMigrationId,String lastMigrationId)
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,String lastMigrationId)
    at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
    at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
ClientConnectionId:ac53af4b-1f9b-4849-a0da-9eb33b836caf
Could not find stored procedure 'GO'.

所以基本上修复脚本打破了一个重要的命令.请帮我决定哪一个是两个罪恶中的较小者!

解决方法

根据 msdn

“GO不是Transact-SQL语句,它是由sqlcmd和osql实用程序和SQL Server Management Studio代码编辑器识别的命令.

由于您没有使用任何上述工具,而是SqlCommand类来执行Sql语句Sql Server(而不是EF – 查看发生异常的堆栈跟踪)正在窒息

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读