重置实体-框架迁移

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

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

是否有任何Disable-Migrations命令,以便我可以重新运行Enable-Migrations?

269340 次浏览

你需要:

  1. 删除状态:删除项目中的迁移文件夹;和
  2. 删除数据库中的__MigrationHistory表(可能在系统表下);然后
  3. 在Package Manager控制台中执行以下命令:

    Enable-Migrations -EnableAutomaticMigrations -Force
    

    -EnableAutomaticMigrations

    一起使用或不一起使用
  4. 最后,你可以运行:

    Add-Migration Initial
    

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

问题:你搞砸了你的迁移,你想重置它而不删除现有的表。

问题:您不能重置数据库中现有表的迁移,因为EF希望从头创建表。

应对方法:

  1. 从Migrations_History表中删除现有的迁移。

  2. 从migrations文件夹中删除现有的迁移。

  3. 执行add-migration Reset命令。这将在migration文件夹中创建一个迁移,其中包括创建表(但它不会运行,因此不会出错)。

  4. 现在需要在MigrationHistory表中创建初始行,以便EF拥有当前状态的快照。如果您应用迁移,EF将执行此操作。但是,您不能应用刚才所做的迁移,因为这些表已经存在于数据库中。因此,进入Migration,注释掉“Up”方法中的所有代码。

  5. 现在运行update-database。它将应用Migration(但不实际更改数据库),并在MigrationHistory中创建快照行。

现在您已经重置了迁移,可以继续进行正常的迁移。

如何

Update-Database –TargetMigration: $InitialDatabase

在包管理器控制台?它应该将所有更新重置到非常早期的状态。

参考链接:代码优先迁移-迁移到特定版本(包括降级)

在EntityFramework 6中,请尝试:

Add-Migration Initial

以便更新初始迁移文件。

在EF6

  1. 删除“migrations”文件夹中的所有文件…但不是'初始创建'或'配置'。
  2. 删除数据库。
  3. 现在运行Add-Migration Initial
  4. 现在你可以“update-database”,一切都会好起来。
Enable-Migrations -EnableAutomaticMigrations -Force

要解决这个问题,你需要:

  1. 删除Migrations文件夹中的所有*.cs文件。

  2. 删除数据库中的_MigrationHistory表

  3. 运行Enable-Migrations -EnableAutomaticMigrations -Force

  4. 运行Add-Migration Reset

然后,在public partial class Reset : DbMigration类中,你需要注释所有现有的和当前的表:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

如果你错过了这一点,一切都将失败,你必须重新开始!

  1. 现在运行Update-Database -verbose

如果您正确地完成了上述操作,那么这应该是成功的,现在您可以正常进行了。

在实体框架核心。

  1. 移除migrations文件夹中的所有文件。

  2. 输入控制台

    dotnet ef database drop -f -v
    dotnet ef migrations add Initial
    dotnet ef database update
    
  3. (或用于包管理器控制台)

    Drop-Database -Force -Verbose
    Add-Migration Initial
    Update-Database
    

UPD:只有在不关心当前持久化数据时才这样做。如果你这样做,用Greg Gum的答案

考虑到当我们在。net Core中搜索EF时仍然会出现这个问题,我将在这里发布我的答案(因为它一直困扰着我)。注意,EF 6 .NET版本有一些微妙之处(没有初始命令,你将需要删除“快照”文件)

(在。net Core 2.1中测试)

以下是步骤:

  1. 删除_efmigrationhistory表。
  2. 在整个解决方案中搜索名称中包含快照的文件,例如ApplicationDbContextSnapshot.cs删除
  3. 重新构建解决方案
  4. 运行Add-Migration InitialMigration
< p >请注意: 必须删除所有的快照文件。我花了无数个小时删除数据库……如果您不这样做,这将生成一个空迁移。

此外,在#3中,您可以随意命名您的迁移。

以下是一些额外的资源: asp.net CORE迁移生成空 < / p >

Reset Entity Framework 7 migration

这个方法不需要删除__MigrationHistory表,所以你不必在部署时把你的手放在数据库上。

  1. 从migrations文件夹中删除现有的迁移。
  2. 在包管理器控制台运行Add-Migration ResetMigrations
  3. Up()方法中的干净迁移历史:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
public override void Up()
{
Sql("DELETE FROM [dbo].[__MigrationHistory]");
}


public override void Down()
{
}
}

在Net Core 3.0中:

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

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

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

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

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

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

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

HTH !

删除 Migrations文件夹,Clean然后Rebuild项目。这对我很管用。在清理和重建之前,它说迁移已经存在,因为在它的缓存内存中,它还没有删除。

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

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext =比;你的背景。

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

VSC(Visual Studio Code) - .Net核心

1.删除状态:删除项目中的迁移文件夹;

2.删除数据库中__MigrationHistory的记录;

< p > 3。dotnet ef database drop -v然后 您确定要删除服务器上的数据库“<your-database”吗?(y / N) 写“N" < / p >

4.dotnet ef migrations添加Initial,然后20211014110429_initial类Write to __MigrationHistory的代码

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

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

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

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

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

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

为了避免上述步骤,有时如果迁移中途失败,您必须逐步完成迁移,并注释掉已经完成的每个migrationBuilder块(按照它们创建的顺序),特别是在不清楚迁移错误的情况下。因此,您可以查看您的db,并看到已删除、重命名、创建的表、列、fk、索引等,然后沿着migrationBuilder块列表向下走,逐步执行迁移(注释掉已完成的步骤,再次运行update-database,重复)。完成后,取消所有注释。

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

不能添加或更新子行:外键约束失败 (Database1#sql-alter-d9b-445b、约束 __abc0外键(__abc1)引用 TableB (' TableBId) < / p >

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

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