我们有一个项目使用ef-migrations,其中包含在长时间开发期间创建的多个(读取~60个)迁移.当然,其中一些迁移还涉及:
我们跑的时候都是独角兽和彩虹
Update-Database
Run Code Online (Sandbox Code Playgroud)
因为每个迁移都作为单独的批处理运行.但是在SQL Scripts使用时为这些迁移创建时
Update-Database -Script
Run Code Online (Sandbox Code Playgroud)
我们遇到了一些问题,如下所述:
在多个迁移文件中删除多个约束时,EF生成的脚本会重新声明它用于删除的变量.这是因为它确保了同一个迁移文件中变量名的唯一性,但是在更改文件时,它会重置计数器,从而重叠名称.
SQL强制执行CREATE TRIGGER始终是批处理中的第一个语句.生成脚本时,EF无视内容,Sql("CREATE TRIGGER ... ");因此不会特别对待它.因此,该语句可能出现在脚本文件的中间,并且出错.
这两个问题的常见/常识解决方案是在正确的位置插入开始/结束sql批处理.手动这样做会让我成为一个非常富有的人,所以这不是一个有效的解决方案.
相反,我们使用了@DavidSette提供的技术.创建一个新的BatchSqlServerMigrationSqlGenerator继承,SqlServerMigrationSqlGenerator从中有效地覆盖dropColumnOperation,sqlOperation然后GO围绕敏感的声明强制声明:
protected override void Generate (System.Data.Entity.Migrations.Model.DropColumnOperation dropColumnOperation)
{
base.Generate(dropColumnOperation);
Statement("GO");
}
Run Code Online (Sandbox Code Playgroud)
此解决方案在Update-Database没有-Script标志的情况下中断运行并出现以下错
System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'GO'.
Run Code Online (Sandbox Code Playgroud)
这是我们的自定义生成器添加的.现在我不确定为什么,但EF应该有一个很好的理由不认识GO!
更多信息:
我有一个使用OOB数据库初始化程序创建的数据库,我使用的是Code First和EF 4.3.1.
我想利用Add-Migration cmdlet上的新"IgnoreChanges"标志,以便我可以更改一些列并添加默认SQL值.本质上,我的一些实体有一个名为DateLastUpdated的列,我想将DEFAULT设置为sql表达式GETDATE().
我使用"add-migration InitialMigration -ignorechanges"创建了InitialMigration,然后我将以下内容添加到Up()和Down():
public override void Up()
{
AlterColumn("CustomerLocations", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
AlterColumn("UserReportTemplates", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
AlterColumn("Chains", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
}
public override void Down()
{
AlterColumn("CustomerLocations", "DateLastUpdated", c => c.DateTime());
AlterColumn("UserReportTemplates", "DateLastUpdated", c => c.DateTime());
AlterColumn("Chains", "DateLastUpdated", c => c.DateTime());
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试运行"Update-Database -verbose",但我发现它正在尝试在数据库上创建相同的命名默认约束,并且SQL抛出异常:
Applying explicit migrations: [201203221856095_InitialMigration].
Applying explicit migration: 201203221856095_InitialMigration.
ALTER TABLE [CustomerLocations] ADD CONSTRAINT DF_DateLastUpdated DEFAULT GETDATE() FOR [DateLastUpdated]
ALTER TABLE [CustomerLocations] ALTER COLUMN [DateLastUpdated] [datetime] …Run Code Online (Sandbox Code Playgroud)