ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

如果您有多个连接字符串,请注意一个重要提示:在重置迁移时指定使用哪一个,否则它将尝试同时应用于两者,这可能会在出现差异时导致问题。
注意:如果您没有删除您的迁移(您确实使用了版本控制吗?),您可以将您的 db 更新为您的第一个迁移,然后删除缓解并从那时起创建新的迁移。见这里:stackoverflow.com/a/23793384/309634

K
Kind Contributor

你需要 :

删除状态:删除项目中的迁移文件夹;并删除数据库中的 __MigrationHistory 表(可能在系统表下);然后在 Package Manager Console 中运行以下命令: Enable-Migrations -EnableAutomaticMigrations -Force 使用或不使用 -EnableAutomaticMigrations 最后,您可以运行: Add-Migration Initial


^^ 弄清楚了——这是一个 TFS 错误——如果您使用的是 TFS,则需要在运行“Enable-Migrations ...”命令之前执行签入。 :D
如果您没有使用版本控制,请在删除之前保存您的种子值!
@RyanJMcGowan 如果您不使用版本控制,那么您应该失去您的工作。 :-)
@Tood。对此+1。为我节省了很多时间。现在,如果只有 EF 团队可以将所有这些合并到 Reset-Migrations 命令中。也许EF 6 ...
对于已有的数据库,需要注释掉“Up”函数的内容。否则运行“Update-Database”会报错,提示表已经存在
G
Greg Gum

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

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

该怎么办:

从 Migrations_History 表中删除现有迁移。从迁移文件夹中删除现有迁移。运行添加迁移重置。这将在您的 Migration 文件夹中创建一个迁移,其中包括创建表(但它不会运行它,因此不会出错。)您现在需要在 MigrationHistory 表中创建初始行,以便 EF 拥有当前状态的快照.如果您应用迁移,EF 将执行此操作。但是,您不能应用刚刚进行的迁移,因为数据库中已经存在表。所以进入迁移并注释掉“Up”方法中的所有代码。现在运行更新数据库。它将应用迁移(而不是实际更改数据库)并在 MigrationHistory 中创建快照行。

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


这是唯一对我有用的答案。接受的答案似乎没有解决运行 Update-Database 或运行应用程序时会发生什么的问题(取决于您使用的初始化程序类型)。它将尝试运行迁移并尝试进行已存在的更改。除非我错过了什么。
这也是更灵活的答案。在我的情况下,我需要应用一些更改,而其他一些则不需要。我可以将有用的东西保留在我的 Up() 中。
@H.Johnson,我看过了。您对此有疑问吗?
需要注意的一件事是,从 EF 6.0 开始,_MigrationsHistory 表包含多个 DBContext 的迁移。删除它可能会导致问题,您应该只删除 ContextKey = 您的迁移名称的行。同样在上述 2 之后,我不得不再次启用迁移
基本相同的答案,带有扩展示例(带屏幕截图):weblog.west-wind.com/posts/2016/Jan/13/…
C
Chris Voon

怎么样

Update-Database –TargetMigration: $InitialDatabase

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

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


我认为我的主要挫折是不再相信迁移能够准确地维护状态。结果想从头开始。
@Todd,我偶然发现并不清楚是否应该删除迁移文件以重新开始。现在它正在执行以下操作: 1. 使用命令“Update-Database –TargetMigration: $InitialDatabase”恢复到初始状态。 2. 删除所有迁移文件(使用 yyyyMMddHHmmssx_Name.cs 或 .vb 命名) 3. 使用“add-Migration -Name some_name”刷新更新。 4. 使用“update-Database”发布更新以影响您的数据库。希望对你有效。
就我而言,此答案中建议的命令导致 SQL 错误。
“初始数据库”应该是什么意思?它会删除数据库中已经创建的表或列吗?
L
Liam Kernighan

在实体框架核心中。

从迁移文件夹中删除所有文件。键入控制台 dotnet ef database drop -f -v dotnet ef migrations add Initial dotnet ef database update(或用于包管理器控制台) Drop-Database -Force -Verbose Add-Migration Initial Update-Database

UPD:仅当您不关心当前的持久数据时才这样做。如果您这样做,use Greg Gum's answer


如果您想保留现有数据(如果您只想“重置迁移”),请不要这样做
小心这个。该问题要求重置迁移,而不是清除数据库数据。
R
Rusty Nail

要解决此问题,您需要:

删除迁移文件夹中的所有 *.cs 文件。删除数据库中的_MigrationHistory表运行Enable-Migrations -EnableAutomaticMigrations -Force Run Add-Migration Reset

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

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

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

现在运行 Update-Database -verbose

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


您也可以只写“return;”,而不是注释掉所有内容。在方法 Up() 的第一行。
M
Matt Frear

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

(在 .NET Core 2.1 中测试)

以下是步骤:

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

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

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

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

Reset Entity Framework 7 migrations


s
sshanzel

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


为我工作!请注意,删除迁移文件夹后,您必须再次运行 enable-migrations。
A
Asaf

在 EntityFramework 6 请尝试:

Add-Migration Initial

为了更新初始迁移文件。


J
John Deighan

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


H
H. Pauwelyn

在 EF6 中

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


O
Olexander Ivanitskyi

此方法不需要删除 __MigrationHistory 表,因此您不必在部署时将手放在数据库上。

从 Migrations 文件夹中删除现有的迁移。在包管理器控制台中运行 Add-Migration ResetMigrations 在 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()
    {
    }
}

S
Sum None

如果您知道您的数据库和代码已同步,并且现在只是挂断了一些简单的事情,例如尝试复制任务的迁移,那么在不丢失数据的情况下重新开始迁移的最简单方法是:

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

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

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

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

Microsoft: Managing Migrations - Resetting all migrations

为了避免上述步骤,有时如果迁移在中途爆炸,您必须逐步执行迁移并注释掉每个已完成的 migrationBuilder 块(按照它们的创建顺序),特别是如果迁移错误不清楚。因此,您可以查看您的数据库并查看已删除、重命名、创建等的表、列、FK、索引等,然后只需查看 migrationBuilder 块列表并逐步完成迁移(注释掉完成步骤,再次运行更新数据库,重复)。完成后,取消注释所有内容。

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

无法添加或更新子行:外键约束失败(Database1.#sql-alter-d9b-445b,CONSTRAINT FK_TableA_TableB_TableBId FOREIGN KEY (TableBId) REFERENCES TableB (`TableBId)

您尝试为其创建 FK 约束的表,它的 FK 约束列与主表的 PK 列中的任何内容都不匹配。最好先使用默认值占位符创建 PK 表来提前为此做好准备,但如果您已经收到错误,那么我们就在这里。解决此问题以避免上述一些更激烈的步骤的最简单方法是:

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


g
greenCodeMonkey

在 Net Core 3.0 中:

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

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

此处建议的策略导致包管理器控制台中出现许多错误:

该名称的迁移已存在

找不到快照

“力”不是公认的参数

诚然,我可能错过了一个步骤或错过了清除正确的文件,但我发现有一些方法可以在没有太多蛮力的情况下清理它:

按名称从 PMC 中删除迁移,以创建相反的顺序,直到并包括损坏的迁移

Add-Migration 创建一个新的迁移,这将是最后一次良好迁移到当前架构之间的增量

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


D
Diego Venâncio

2020 年更新 => 重置实体框架迁移

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => 你的上下文。

但是,如果您只需要更新存在的身份架构,请尝试:https://stackoverflow.com/a/59966100/4654957


没有关于这试图解决什么的上下文。
C
Cll

VSC(Visual Studio 代码)——.Net Core

1.删除状态:删除你项目中的migrations文件夹;

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

3.dotnet ef database drop -v 那么您确定要删除服务器“.”上的数据库“<your-database”吗? (y/N) 写“N”

4.dotnet ef migrations add Initial 然后将20211014110429_initial类的代码写入__MigrationHistory的


D
Debendra Dash
Enable-Migrations -EnableAutomaticMigrations -Force