重置实体框架迁移

Tod*_*odd 287 entity-framework database-migration ef-migrations

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

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

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

Tod*_*odd 430

你需要 :

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

    Enable-Migrations -EnableAutomaticMigrations -Force
    
    Run Code Online (Sandbox Code Playgroud)

    使用或不使用 -EnableAutomaticMigrations

  4. 最后,你可以运行:

    Add-Migration Initial
    
    Run Code Online (Sandbox Code Playgroud)

  • @RyanJMcGowan如果你没有使用版本控制,你应该失去你的工作.:-) (73认同)
  • 对于现有数据库,您需要注释掉"向上"功能的内容.否则,当您运行"Update-Database"时会出现错误,它会抱怨该表已经存在 (22认同)
  • 如果您没有使用版本控制,请在删除之前保存Seed值! (7认同)
  • ^^想出来 - 这是一个TFS错误 - 如果您使用TFS,则需要在运行"Enable-Migrations ..."命令之前执行签入.:d (5认同)
  • @Tood.+1那个.节省了我很多时间.现在,如果只有EF团队可以将所有这些内容整合到Reset-Migrations命令中.也许EF 6 ...... (4认同)

Gre*_*Gum 143

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

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

该怎么办:

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

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

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

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

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

您现在已重置迁移,并可能继续正常迁移.

  • 这是唯一对我有用的答案.接受的答案似乎没有解决运行Update-Database或运行应用程序时发生的问题(取决于您使用的初始化程序类型).它将尝试运行迁移并尝试进行已存在的更改.除非我错过了什么. (11认同)
  • 基本上相同的答案,有一个扩展的例子(带截图):https://weblog.west-wind.com/posts/2016/Jan/13/Resetting-Entity-Framework-Migrations-to-a-clean-Slate (4认同)
  • 缺少最后一步:取消注释那些 UP 例程。您部署到的下一个环境(其中不存在表)将需要它们。而且它们不会打扰当前环境中的任何事情,因为历史表知道它们已经被应用。 (3认同)
  • 这也是更灵活的答案.在我的情况下,我需要应用一些更改,而其他一些则不适用.我可以在我的Up()中保留有用的东西. (2认同)
  • 需要注意的一件事是,从 EF 6.0 开始,_MigrationsHistory 表包含多个 DBContext 的迁移。删除它可能会导致问题,您应该只删除 ContextKey = 您的迁移名称的行。同样在上述 2 之后,我不得不再次启用迁移 (2认同)
  • 哇,我把Rick击败了2年.我的生活现在已经完成.我通常落后他五年! (2认同)

Chr*_*oon 29

怎么样

Update-Database –TargetMigration: $InitialDatabase
Run Code Online (Sandbox Code Playgroud)

在包管理器控制台?它应该将所有更新重置为其早期状态.

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


Rus*_*ail 16

要解决此问题,您需要:

  1. 删除迁移文件夹中的所有*.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>
// ...
// }
...
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 现在跑 Update-Database -verbose

如果您已正确完成上述操作,这应该会成功,现在您可以正常继续.

  • 除了注释掉所有内容之外,您还可以只写“ return;”。在方法Up()的第一行中。 (2认同)

Lia*_*han 12

在实体框架核心中。

  1. 从迁移文件夹中删除所有文件。

  2. 在控制台输入

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

    Drop-Database -Force -Verbose
    Add-Migration Initial
    Update-Database
    
    Run Code Online (Sandbox Code Playgroud)

UPD:仅当您不关心当前的持久数据时才这样做。如果你这样做,请使用 Greg Gum 的回答

  • 对此要小心。该问题要求重置迁移,而不是清除数据库数据。 (10认同)
  • 如果您想保留现有数据(如果您只想“重置迁移”),请不要执行此操作 (8认同)

Jos*_*e A 9

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

(在 .NET Core 2.1 中测试)

以下是步骤:

  1. 删除 _efmigrationhistory表。
  2. 在整个解决方案中搜索名称中包含Snapshot 的文件,例如ApplicationDbContextSnapshot.cs,然后删除
  3. 重建您的解决方案
  4. Add-Migration InitialMigration

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

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

下面是一些额外的资源: asp.net CORE Migrations generated empty

重置实体框架 7 迁移


Cli*_*ley 9

对于 EFCore 6/7:

要将一段时间内的所有更改合并回单个文件,并将其应用到现有数据库,同时保留所有数据(即在生产中和其他开发人员中),这些步骤对我有用:

  1. Migrations从项目文件夹中删除现有迁移。
  2. 删除 Context Snapshop 文件。即ApplicationDbContextSnapshot.csDatabaseContextModelSnapshot.cs或类似的。
  3. 重建您的解决方案
  4. 跑步Add-Migration Initial(可以按照您喜欢的方式命名,而不是Initial)。这将在您的迁移文件夹中创建一个迁移,其中包括创建表,但尚未应用。
  5. 打开生成的迁移文件 和comment out all the code inside the "Up" method,以便它不会对所有现有表进行任何更改。(这使我们能够以正确的格式更新数据库,而无需在下一步中进行任何更改)
  6. 在 Up 函数中的注释代码之前添加migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]");以在迁移期间应用删除/截断
public partial class Initial : Migration
{
    public override void Up()
    {
        migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]");
        /*
          OTHER COMMENTED OUT CODE
        */
    }

    public override void Down()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 跑步Update-Database它将应用迁移并删除现有的迁移跟踪条目(而不实际更改数据库模式)并在中创建快照行__EFMigrationsHistory
  2. 提交此代码并像平常一样应用到您的开发、登台和生产数据库(确保代码仍然在 Up 函数中被注释掉,不会应用任何更改,除了在 中创建的新条目__EFMigrationsHistory
  3. 删除migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]");并取消注释第 5 步中的所有代码,然后提交回源代码管理。(这样新的开发人员可以从头开始创建数据库。如果有人忘记更新现有数据库,则会出错并抱怨表已经存在,因此他们只需注释掉初始文件并应用即可。)


Sie*_*21x 6

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

  • 为我工作!请注意,删除迁移文件夹后,您必须再次运行enable-migrations。 (2认同)

归档时间:

查看次数:

180405 次

最近记录:

6 年,1 月 前