我搞砸了我的迁移,我在初始迁移中使用了 IgnoreChanges
,但现在我想删除我的所有迁移并从包含所有逻辑的初始迁移开始。
当我删除文件夹中的迁移并尝试 Add-Migration
时,它不会生成完整文件(它是空的 - 因为自上次迁移以来我没有进行任何更改,但现在已删除)。
是否有任何 Disable-Migrations 命令,以便我可以重新运行 Enable-Migrations
?
你需要 :
删除状态:删除项目中的迁移文件夹;并删除数据库中的 __MigrationHistory 表(可能在系统表下);然后在 Package Manager Console 中运行以下命令: Enable-Migrations -EnableAutomaticMigrations -Force 使用或不使用 -EnableAutomaticMigrations 最后,您可以运行: Add-Migration Initial
问题:你搞砸了你的迁移,你想在不删除现有表的情况下重置它。
问题:您无法使用数据库中的现有表重置迁移,因为 EF 想要从头开始创建表。
该怎么办:
从 Migrations_History 表中删除现有迁移。从迁移文件夹中删除现有迁移。运行添加迁移重置。这将在您的 Migration 文件夹中创建一个迁移,其中包括创建表(但它不会运行它,因此不会出错。)您现在需要在 MigrationHistory 表中创建初始行,以便 EF 拥有当前状态的快照.如果您应用迁移,EF 将执行此操作。但是,您不能应用刚刚进行的迁移,因为数据库中已经存在表。所以进入迁移并注释掉“Up”方法中的所有代码。现在运行更新数据库。它将应用迁移(而不是实际更改数据库)并在 MigrationHistory 中创建快照行。
您现在已重置迁移,可以继续进行正常迁移。
怎么样
Update-Database –TargetMigration: $InitialDatabase
在包管理器控制台中?它应该将所有更新重置为其早期状态。
参考链接:Code First Migrations - Migrating to a Specific Version (Including Downgrade)
在实体框架核心中。
从迁移文件夹中删除所有文件。键入控制台 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
要解决此问题,您需要:
删除迁移文件夹中的所有 *.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
如果您正确地完成了上述操作,这应该是成功的,现在您可以正常进行了。
考虑到当我们在 .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
删除 Migrations
文件夹,Clean
然后Rebuild
项目。这对我有用。在清理和重建之前,它说迁移已经存在,因为在它的缓存内存中,它还没有被删除。
在 EntityFramework 6 请尝试:
Add-Migration Initial
为了更新初始迁移文件。
我的问题原来是我手动删除了 Migrations 文件夹。我这样做是因为我想备份内容,所以我只是将文件夹拖出项目。我后来通过将其放回(在制作备份副本后)解决了这个问题,然后通过在解决方案资源管理器中右键单击它并从弹出菜单中选择删除来删除迁移文件夹。
在 EF6 中
删除“迁移”文件夹中的所有文件...但不是“初始创建”或“配置”。删除数据库。现在运行 Add-Migration Initial。现在您可以“更新数据库”,一切都会好起来的。
此方法不需要删除 __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()
{
}
}
如果您知道您的数据库和代码已同步,并且现在只是挂断了一些简单的事情,例如尝试复制任务的迁移,那么在不丢失数据的情况下重新开始迁移的最简单方法是:
删除 VS 中的 Migrations 文件夹。创建一个新的迁移(例如 add-migration InitialCreate) 从 __EFMigrationsHistory db 中删除除第一行之外的所有内容,并将第一行值更改为您的第一个迁移名称以及日期代码(例如 20220510060015_InitialCreate)
如果您不知道迁移表的 ProductVersion
,可以在新创建的 Migrations 文件夹的 Designer
或 Snaphot
.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 约束并完成。取消注释所有内容。
在 Net Core 3.0 中:
我无法找到重置迁移的方法。
我也遇到了迁移失败的问题,这里提供的答案对我不起作用。我有一个 .Net Core 3.0 Web API,在上个月的某个地方,我直接编辑了数据库。是的,我做了一件坏事,坏事。
此处建议的策略导致包管理器控制台中出现许多错误:
该名称的迁移已存在
找不到快照
“力”不是公认的参数
诚然,我可能错过了一个步骤或错过了清除正确的文件,但我发现有一些方法可以在没有太多蛮力的情况下清理它:
按名称从 PMC 中删除迁移,以创建相反的顺序,直到并包括损坏的迁移
Add-Migration 创建一个新的迁移,这将是最后一次良好迁移到当前架构之间的增量
现在,当 Web API 以空数据库启动时,它会正确创建所有表和属性以匹配实体模型。
!
2020 年更新 => 重置实体框架迁移
Add-Migration Initial -Context ApplicationDbContext
ApplicationDbContext => 你的上下文。
但是,如果您只需要更新存在的身份架构,请尝试:https://stackoverflow.com/a/59966100/4654957
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的
Enable-Migrations -EnableAutomaticMigrations -Force