重置实体框架迁移


299

我已经IgnoreChanges对初始迁移进行了重新整理,但是现在我想删除所有迁移,并从所有逻辑开始进行初始迁移。

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

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



3
一个重要的注意事项,如果您有多个连接字符串:请指定在重置迁移时使用哪个连接字符串,否则它将尝试同时应用于这两个在出现差异时可能导致问题的问题。
Jeroen Vannevel 2014年

注意:如果您尚未删除迁移(您确实使用版本控制权吗?),则可以更新数据库-首先迁移,然后删除缓解措施并从那时开始创建新迁移。看到这里:stackoverflow.com/a/23793384/309634
DarcyThomas '16

Answers:


446

你需要 :

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

    Enable-Migrations -EnableAutomaticMigrations -Force

    搭配或不搭配使用 -EnableAutomaticMigrations

  4. 最后,您可以运行:

    Add-Migration Initial

5
^^弄清楚-这是TFS错误-如果您使用的是TFS,则需要在运行“ Enable-Migrations ...”命令之前执行检入。:D
BrainSlugs83 2013年

7
如果您不使用版本控制,请在删除前保存您的种子值!
RyanJMcGowan

77
@RyanJMcGowan如果您不使用版本控制,则应失去工作。:-)
Mike Cole

4
@Tood。+1。节省了我很多时间。现在,如果只有EF团队可以将所有内容合并到Reset-Migrations命令中。也许是EF 6 ...
Gerald Davis

24
对于现有数据库,您需要注释掉“向上”功能的内容。否则,当您运行“ Update-Database”时,您将得到一个错误,它将抱怨该表已经存在
Guy

149

问题:您已经对迁移进行了重新设计,并且希望在不删除现有表的情况下进行重置。

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

该怎么办:

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

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

  3. 运行添加迁移重置。这将在包含创建表的“迁移”文件夹中创建一个迁移(但是不会运行它,因此不会出错)。

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

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

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


11
这是唯一对我有用的答案。可接受的答案似乎无法解决运行Update-Database或运行应用程序时发生的问题(取决于您使用的初始化程序类型)。它将尝试运行迁移并尝试进行已存在的更改。除非我错过了什么。
Regularmike 2014年

2
这也是更灵活的答案。就我而言,我需要应用某些更改,而其他更改则不需要。我可以将有用的东西保留在Up()中。
tec-goblin 2014年

1
@ H.Johnson,我已经看过了。您对此有疑问吗?
Greg Gum 2015年

2
要注意的一件事是,从EF 6.0开始,_MigrationsHistory表包含针对多个DBContext的迁移。删除它可能会导致问题,您应该只删除ContextKey =您的迁移名称的行。同样在上述2分之后,我不得不再次启用迁移功能
David Waterworth

2
基本上相同的答案,与扩大的例子(与截图):weblog.west-wind.com/posts/2016/Jan/13/...
nmit026

30

怎么样

Update-Database TargetMigration: $InitialDatabase

在Package Manager控制台中?它应该将所有更新重置为非常早的状态。

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


我认为我的主要挫败感不再是依靠迁移来准确维护状态。结果是想从头开始。
2014年

@Todd,我偶然发现,并不确定是否应该删除迁移文件以重新开始。现在,它可以进行以下操作:1.使用命令“ Update-Database –TargetMigration:$ InitialDatabase”恢复到初始状态。2.删除所有迁移文件(使用yyyyMMddHHmmssx_Name.cs或.vb命名)。3.使用'add-Migration -Name some_name'刷新更新。4.使用“ update-Database”发布更新以影响您的数据库。希望对你有效。
克里斯·冯

就我而言,此答案中建议的命令导致SQL错误。
贾斯汀·斯基尔斯

“ InitialDatabase”是什么意思?它将删除数据库中已经创建的表或列吗?
Serge

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>
// ...
// }
...
}

如果错过这一点,所有操作都会失败,您必须重新开始!

  1. 现在运行 Update-Database -verbose

如果您已正确完成上述操作,则应该成功,现在您可以正常进行了。


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

6

考虑到当我们在.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迁移生成为空

重置实体框架7迁移


3

在EntityFramework 6中,请尝试:

Add-Migration Initial

为了更新初始迁移文件。



2

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


1

在EF6中

  1. 删除“ migrations”文件夹中的所有文件...但不要“初始创建”或“ config”。
  2. 删除数据库。
  3. 现在运行Add-Migration Initial
  4. 现在,您可以“更新数据库”,一切都会好起来。

1

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


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()
    {
    }
}

0

在Net Core 3.0中:

我找不到重新设置迁移的方法

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

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

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

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

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

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

HTH!



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.