重置实体框架迁移

时间:2012-07-26 23:15:47

标签: entity-framework database-migration ef-migrations

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

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

是否有 Disable-Migrations 命令,所以我可以重新运行Enable-Migrations

14 个答案:

答案 0 :(得分:421)

你需要:

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

    Enable-Migrations -EnableAutomaticMigrations -Force
    

    使用或不使用-EnableAutomaticMigrations

  4. 最后,您可以运行:

    Add-Migration Initial
    

答案 1 :(得分:140)

问题:您已经搞砸了迁移,并且想要在不删除现有表格的情况下重置它。

问题:您无法使用数据库中的现有表重置迁移,因为EF希望从头开始创建表。

怎么做:

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

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

  3. 运行add-migration Reset。这将在您的Migration文件夹中创建一个包含创建表的迁移(但它不会运行它,因此不会出错。)

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

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

  6. 您现在已经重置了迁移,可能会继续正常迁移。

答案 2 :(得分:27)

怎么样

Update-Database –TargetMigration: $InitialDatabase
包管理器控制台中的

?它应该将所有更新重置为其早期状态。

参考链接:Code First Migrations - Migrating to a Specific Version (Including Downgrade)

答案 3 :(得分:16)

要解决此问题,您需要:

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

  2. 删除数据库中的_MigrationHistory表

  3. 运行Enable-Migrations -EnableAutomaticMigrations -Force

  4. 运行Add-Migration Reset

  5. 然后,在public partial class Reset : DbMigration类中,您需要评论所有现有和当前的表:

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

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

    1. 现在运行Update-Database -verbose
    2. 如果您已正确完成上述操作,这应该会成功,现在您可以正常继续。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

在EntityFramework 6中,请尝试:

Add-Migration Initial

以更新初始迁移文件。

答案 6 :(得分:2)

考虑到当我们在.NET Core中搜索EF时,仍然会出现这种情况,我将在此处发布答案(因为它困扰了我很多)。请注意,EF 6 .NET版本有一些微妙之处(无初始命令,您将需要删除“快照”文件)

(在.NET Core 2.1中测试)

以下是步骤:

  1. 删除_efmigrationhistory表。
  2. 在整个解决方案中搜索名称中包含快照的文件,例如ApplicationDbContextSnapshot.cs,并删除
  3. 运行Add-Migration InitialMigration

请注意: 您必须删除所有快照文件。我花了无数小时才删除数据库...如果您不这样做,将会生成一个空迁移。

此外,在#3中,您可以根据需要命名迁移。

以下是一些其他资源: asp.net CORE Migrations generated empty

Reset Entity Framework 7 migrations

答案 7 :(得分:2)

删除 Migrations 文件夹,依次 Clean ,然后 Rebuild >项目。这对我有用。在进行清理和重建之前,它说迁移已经存在,因为它已经存在于其缓存的内存中,尚未被删除。

答案 8 :(得分:1)

在EF6中

  1. 删除“迁移”文件夹中的所有文件...但不是“初始创建”或“配置”。
  2. 删除数据库。
  3. 现在运行Add-Migration Initial
  4. 现在你可以'更新 - 数据库',一切都会好的。

答案 9 :(得分:1)

在Entity Framework Core中。

  1. 从迁移文件夹中删除所有文件。
  2. 输入控制台
  

dotnet ef数据库drop -f -v

     

dotnet ef迁移添加初始

     

dotnet ef数据库更新

答案 10 :(得分:1)

UPDATE 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext =>您的上下文。

答案 11 :(得分:0)

此方法不需要删除__MigrationHistory表,因此您不必动手部署数据库。

  1. 从“迁移”文件夹中删除现有迁移。
  2. 在Package Manager控制台中运行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()
    {
    }
}

答案 12 :(得分:0)

在Net Core 3.0中:

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

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

此处建议的策略在Package Manager控制台中导致了许多错误:

  • 该名称的迁移已存在
  • 找不到快照
  • 'Force'不是公认的参数

当然,我可能错过了一步或错过了清除正确的文件的操作,但是我发现有一些方法可以在没有太多暴力的情况下进行清理:

  • 对于每个迁移,按名称(创建顺序相反)从PMC删除迁移,直到破坏中断的迁移为止,包括该破坏
  • 添加迁移以创建新迁移,该迁移将是最后一次良好迁移到当前架构之间的增量

现在,当使用空数据库启动Web API时,它将正确创建所有表和属性以匹配实体模型。

HTH!

答案 13 :(得分:-2)

Enable-Migrations -EnableAutomaticMigrations -Force