我已经搞砸了我的迁移,我在初始迁移上使用了IgnoreChanges,但现在我想删除所有的迁移,并从具有所有逻辑的初始迁移开始。

当我删除文件夹中的迁移并尝试添加- migration时,它不会生成一个完整的文件(它是空的-因为我没有做任何更改,但现在删除了,迁移)。

是否有禁用-迁移命令,以便我可以重新运行启用-迁移?


当前回答

如果你知道你的数据库和代码是同步的,现在只是挂在一些简单的事情上,比如试图复制任务的迁移,最简单的方法是重新开始迁移而不丢失数据:

删除VS中的Migrations文件夹。 创建一个新的迁移(例如add-migration InitialCreate) 从__efmigrationhistory db中删除除第一行外的所有内容,并将第一行值更改为带有日期代码的第一个迁移名称(例如20220510060015_InitialCreate)

如果您不知道迁移表的ProductVersion,您可以在新创建的Migrations文件夹中的Designer或Snaphot .cs文件中找到它。

现在,当您运行update-database时,它应该不会出错(并且不执行任何任务)。如果您在早期的迁移中进行了大量的重命名、删除、表、列等操作,那么这可能也是为初始生产环境获得最干净的SQL迁移脚本的好方法。

如果您的代码和db不同步,这取决于您处理的数据量和它们不同步的程度,最好执行上面的步骤1和2,然后备份db并删除它,让迁移从头开始重新创建它,然后恢复数据。

微软:管理迁移-重置所有迁移

To avoid the steps above, sometimes if a migration blows up midway through, you have to step through a migration and comment out each migrationBuilder block that's already completed (in the order they were created), especially if it's not clear from the migration error. So you can look at your db and see that tables, columns, FKs, indexes, etc. that have been dropped, renamed, created, etc. and then just go down the list of migrationBuilder blocks and step through the migration (comment out the completed steps, run update-database again, repeat). When you're done, uncomment everything.

如果表中已经有数据,并且您正在尝试添加FK约束,则可能会遇到另一个常见错误:

无法添加或更新子行:外键约束失败 (Database1。# sql -修改- d9b - 445 b,约束 FK_TableA_TableB_TableBId外键(TableBId)引用 表b (' TableBId)

你要创建FK约束的表,它的FK约束列与主表的PK列不匹配。最好提前做好准备,首先创建一个带有默认值占位符的PK表,但是如果您已经收到了错误,那么我们就在这里。解决这个问题以避免上述一些更激烈的步骤的最简单的方法是:

检查是否创建了FK列,是否分配了默认值(例如,在TableA中,FK约束TableBId = "0")。 修改PK表(或先创建它),使用第一步中分配的默认PK Id记录(例如,在TableB中,创建TableBId = "0"的记录)。 注释掉migrationBuilder之前的所有内容。AddForeignKey块出错并再次运行update-database。迁移现在应该创建FK约束并完成。 取消一切。

其他回答

在Net Core 3.0中:

我无法找到重置迁移的方法。

我还遇到了迁移中断的问题,这里提供的答案对我不起作用。我有一个。net Core 3.0 web API,在上个月的某个地方我直接编辑了数据库。是的,我做了一件非常非常糟糕的事。

这里建议的策略导致了包管理器控制台中的一些错误:

该名称的迁移已经存在 找不到快照 “力”不是一个公认的参数

当然,我可能错过了一个步骤,或者错过了清除正确的文件,但我发现有一些方法可以在不使用暴力的情况下清理这些文件:

从PMC中按名称(按创建的相反顺序)删除-迁移,直至并包括中断的迁移 Add-Migration创建一个新的迁移,它将是最后一次良好迁移到当前模式之间的增量

现在,当web API从一个空数据库启动时,它正确地创建了与实体模型匹配的所有表和属性。

HTH!

我的问题是手动删除了Migrations文件夹。我这样做是因为我想备份内容,所以我只是将文件夹拖出项目。后来我修复了这个问题,把它放回去(在做了备份副本之后),然后在解决方案资源管理器中右键单击它并从弹出菜单中选择删除,从而删除了Migrations文件夹。

对于 EFCore 6/7:

为了将所有更改合并到单个文件中,并将其应用到现有数据库中,同时保留所有数据(即在Production和其他开发中),以下步骤对我来说很有效:

Delete existing migrations from the Migrations Folder in your project. Delete the Context Snapshop files. I.e. ApplicationDbContextSnapshot.cs, DatabaseContextModelSnapshot.cs or similar. Rebuild your solution Run Add-Migration Initial. (Can be named how you like instead of Initial). This will create a migration in your Migration folder that includes creating the tables, but won't be applied yet. Open the generated Migration file and comment out all the code inside the "Up" method, so that it doesn't make any changes to all your existing tables. (This allows us to update the database in the correct format, without making any changes in the next step) Before the commented code within the Up function, add migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]"); to have the delete/truncate applied during migration

public partial class Initial : Migration
{
    public override void Up()
    {
        migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]");
        /*
          OTHER COMMENTED OUT CODE
        */
    }

    public override void Down()
    {
    }
}

Run Update-Database. It will apply the Migration and remove existing migration tracking entriers (while not actually changing the database schema) and create a snapshot row in __EFMigrationsHistory Submit this code and apply to your dev, staging and production databases as you normally would (Ensure the code is still commented out in the Up function, no changes will be applied, except a new entry created in __EFMigrationsHistory) Remove migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]"); and uncomment all the code from step 5 and submit back to source control. (This way new devs can create the db from scratch. If someone forgot to update their existing database, it'll error out and complain that the tables already exist, so they can just comment the Initial file out and apply.)

UPDATE 2020 =>重置实体-框架迁移

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext =>您的上下文。

但是如果你只需要更新一个存在的标识模式,试试它: https://stackoverflow.com/a/59966100/4654957

Enable-Migrations -EnableAutomaticMigrations -Force