Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在同一升级中执行EF核心迁移时失败_C#_Sql_Sql Server_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 在同一升级中执行EF核心迁移时失败

C# 在同一升级中执行EF核心迁移时失败,c#,sql,sql-server,entity-framework,entity-framework-core,C#,Sql,Sql Server,Entity Framework,Entity Framework Core,关于标题我很抱歉,我不知道该怎么称呼这个 在创建新表后,我需要将数据从一个表迁移到另一个表。 因此,我创建了两个迁移,一个用于创建通过标准代码生成的表,第一个是神怪,第二个是进行更复杂数据移植的迁移,即使用一些自定义Sql调用MigrationBuilder.Sql(“…”) 我遇到的问题是,如果我一次性运行我的项目,当ef尝试应用迁移时,我会得到一个无效列异常,但是如果我签出分支,使我只执行第一次迁移(并运行项目),然后移动分支以包括第二次迁移(然后再次运行项目)它将愉快地运行迁移 有点感觉在

关于标题我很抱歉,我不知道该怎么称呼这个

在创建新表后,我需要将数据从一个表迁移到另一个表。
因此,我创建了两个迁移,一个用于创建通过标准代码生成的表,第一个是神怪,第二个是进行更复杂数据移植的迁移,即使用一些自定义Sql调用MigrationBuilder.Sql(“…”)

我遇到的问题是,如果我一次性运行我的项目,当ef尝试应用迁移时,我会得到一个无效列异常,但是如果我签出分支,使我只执行第一次迁移(并运行项目),然后移动分支以包括第二次迁移(然后再次运行项目)它将愉快地运行迁移

有点感觉在迁移之间缺少GO语句。我试着介绍,但还是失败了。有没有办法将迁移分开,这样它就不会“批处理”它们,而是一个接一个地运行它们。

我认为这些迁移已经一次运行一个,例如,查看更改
migrationBuilder.RenameTable
和migrationBuilder.AddForeignKey`顺序的效果。
所以,这可能是一个旧的错误或功能得到了修复?不管怎样,我会给你一些选择,也许对某人有用

在偶然的情况下,您可以通过命令行按名称调用迁移来逐个运行迁移。不过,这似乎很难在构建过程中实现自动化

Update-Database -Migration 20190402070159_Migration1
Update-Database -Migration 20190402080259_Migration2
您也可以从代码中一个接一个地运行迁移,我(也)希望是不同的事务。(但是,请注意,除非“对于具有本地数据库的应用程序”,否则在运行时调用迁移是非常困难的。可能会有同时启动多个运行时迁移的风险,并且会出现并发问题?
例如:

使用(var db=new MyDbContext())
{
OpenConnection();
尝试
{
var migrator=db.GetService();
foreach(db.Database.GetPendingMigrations()中的var迁移)
{
migrator.Migrate(迁移);
//我不认为你需要一个“db.Save”在这里
}
}
最后
{
db.Database.CloseConnection();
}
}

您尝试了什么GO语句?是否尝试过
DbContext.Save()
?如果编写一个SQL脚本来创建一个表并插入数据,您将在这两部分之间放置一个GO语句,否则该脚本将失败,因为它无法识别新表/列。迁移生成器似乎将整个脚本转储在一起,而不会分离迁移,从而导致迁移失败。这里DbContext.Save没有帮助,因为它是通过迁移系统完成的。除非您能够调用它,否则会引发另一系列问题。@bricelam迁移是否会在每次迁移之间添加Go?
using (var db = new MyDbContext())
{
    db.Database.OpenConnection();
    try
    {
        var migrator = db.GetService<IMigrator>();
        foreach (var migration in db.Database.GetPendingMigrations())
        {
            migrator.Migrate(migration);
            // I don't expect you need a `db.Save` here
        }
    }
    finally
    {
        db.Database.CloseConnection();
    }
}