如何使用 EF Core 在 ASP.NET Core 中取消应用迁移
Posted
技术标签:
【中文标题】如何使用 EF Core 在 ASP.NET Core 中取消应用迁移【英文标题】:How to unapply a migration in ASP.NET Core with EF Core 【发布时间】:2016-11-06 15:25:03 【问题描述】:当我在 VS2015 中使用 EF Core 的 ASP.NET Core 项目运行 PM> Remove-Migration -context BloggingContext
时,我收到以下错误:
System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration. at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force)
at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force)
at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0()
at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args)
at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args)
The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
如何取消应用?我正在使用最新版本的 ASP.NET Core 1.0、EF Core 和 VS2015 Update 3。
【问题讨论】:
尝试在末尾添加-force
文章learnentityframeworkcore.com/migrations#reversing-a-migration 描述了这些步骤。感谢@drewskis 的链接
【参考方案1】:
用途:
CLI
> dotnet ef database update <previous-migration-name>
包管理器控制台
PM> Update-Database <previous-migration-name>
例子:
PM> Update-Database MyInitialMigration
然后尝试删除上次迁移。
在不更新数据库的情况下删除迁移不起作用,因为您将更改应用于数据库。
如果使用 PMC,请尝试: PM> 更新数据库 0 这将擦除数据库并允许您删除解决方案上的迁移快照
【讨论】:
我仍然遇到同样的错误。我首先使用了成功的dotnet ef database update MyFirstMigration --context BloggingContext
。然后我跑了dotnet ef migrations remove --context BloggingContext
,它给了我和我的帖子一样的错误信息
您需要在MyFirstMigration
之前更新到迁移。如果这是第一次迁移(顾名思义),那么您可以使用dotnet ef database update 0
来恢复(取消应用)数据库中的所有迁移。然后你应该能够运行dotnet ef migrations remove
。
另外值得注意的是,您应该只使用迁移的名称,不包括日期前缀
在此之后致电dotnet ef migrations remove
您的第二个陈述:“然后尝试删除上次迁移”在此答案中不完整,请准确说出您的意思。删除迁移文件?执行命令? ...【参考方案2】:
要完全删除所有迁移并重新开始,请执行以下操作:
dotnet ef database update 0
dotnet ef migrations remove
【讨论】:
但您不想删除所有迁移。例如,您希望保留 VS 在 Data\Migrations 文件夹下为身份(用户帐户)创建的默认迁移。 很高兴知道dotnet ef database update 0
,但之后运行dotnet ef migrations remove
将删除身份的默认迁移,这可能是不希望的。
@nam "但是您不想删除所有迁移。"但我们中的一些人这样做。不要假设我想要什么:)
这对我不起作用。第一行没问题并删除所有迁移,在第二行我仍然得到The migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
@ShimmyWeitzhandler 是的。 ***.com/a/55323154/109941【参考方案3】:
取消应用特定迁移:
dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName
取消应用所有迁移:
dotnet ef database update 0
or
PM> Update-Database -Migration 0
要删除上次迁移:
dotnet ef migrations remove
or
PM> Remove-Migration
要删除所有迁移:
只需删除 Migrations
文件夹。
要删除最后几个迁移(不是全部):
没有删除大量迁移的命令,我们不能只删除这几个migrations
和它们的*.designer.cs
文件,因为我们需要保持快照文件处于一致状态。我们需要一一移除迁移(参见上面的To remove last migration
)。
取消应用并删除上次迁移:
dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
【讨论】:
我一直在这些帖子中看到unapply
这个词。我突然想到这不是一个技术术语,而是un - apply
这个词
不知道“down”这个方法是干什么用的?
在我的 Visual Studio IDE 中查看名为 Migrations
的文件夹并在我的包管理器控制台中运行上述命令时,如果此答案能说明预期结果,那将非常有用。例如,删除是否会影响 Migrations 文件夹的内容?也就是说,应该删除由Add-Migration
产生的文件,还是保留它们并且我需要手动删除它们?谢谢!
dotnet ef migrations remove --force 在 ef core 中为我工作
@Pajri Aprilio 删除迁移时,“向下”部分列出了撤消所述迁移所需的步骤。【参考方案4】:
要恢复上次应用的迁移,您应该(包管理器控制台命令):
-
从数据库恢复迁移:
PM> Update-Database <prior-migration-name>
从项目中删除迁移文件(否则将在下一步重新应用)
更新模型快照:PM> Remove-Migration
UPD: 最新版本的 Visual Studio (2017) 似乎不需要第二步。
【讨论】:
谢谢!这非常有效,令人着迷的是,在所有解决方案中,没有人提到过第 2 步的必要性。 是的,没有人提到第二步。谢谢 不确定第二步,在我的情况下(最新的VS2017)迁移文件将在调用Remove-Migration
后自动删除,没有问题。我不确定您所说的“它将在下一步重新应用”!
@S.Serpooshan 确实如此。我手动删除了它,但是当我运行 Remove-Migration 时,它抱怨我之前的迁移已应用于数据库。但是,它有效。
我认为只有在你的 startup.cs 中调用 dbContext.Database.Migrate()
时才需要第二步【参考方案5】:
您仍然可以使用Update-Database
命令。
Update-Database -Migration <migration name> -Context <context name>
但是,从您的迁移名称来看,我假设这是第一次迁移,因此该命令可能不起作用。您应该能够从数据库中的__MigrationHistory
表中删除该条目,然后再次运行Remove-Migration
命令。您也可以删除迁移文件,然后重新开始。
【讨论】:
您可以从包管理控制台调用Update-Database
,或者从项目目录的命令提示符调用dotnet ef database update
。
只是为了澄清布拉德的答案 - <migration name>
应该是您想要返回的迁移的名称(即可能是迁移之前 您搞砸的那个),而不是您要撤消的迁移的名称。【参考方案6】:
您应该从 '_EFMigrationsHistory' 表中删除迁移 '20160703192724_MyFirstMigration' 记录。
否则以下命令将删除迁移并删除迁移文件夹:
PMC 命令:
> remove-migration -force
CLI 命令:
> dotnet ef migrations remove -f
Link About CLI Commands
Link About PMC Commands
【讨论】:
【参考方案7】:您只需按值定位迁移
Update-Database -Migration:0
然后继续删除它
Remove-Migration
【讨论】:
这对我有用,但我在 VS2017 中使用 EF 和 .NET core 2.0 注意:-Migration:0 表示返回到没有迁移的状态。这将清除您的数据库 是的,根据提出的问题。您可以根据要回滚到的迁移来增加值 在 .Net Core 3.1 中工作【参考方案8】:在包管理器控制台中:
Update-Database Your_Migration_You_Want_To_Revert_To
More options and explanation on how to revert migrations can be seen here
【讨论】:
有用的链接,应该是问题的评论 这就是你想在 .NET core 中使用的东西【参考方案9】:在已经应用到数据库之后“取消应用”最近的(最近的?)迁移:
-
打开 SQL Server 对象资源管理器(查看 ->“SQL Server 对象资源管理器”)
通过将小三角形展开到侧面,导航到链接到您的项目的数据库。
展开“表格”
找到名为“dbo._EFMigrationsHistory”的表。
右键单击它并选择“查看数据”以在 Visual Studio 中查看表条目。
删除与您要取消应用的迁移对应的行(如果出现提示,请对警告说“是”)。
在包含 project.json 文件的目录中的命令窗口中再次运行“dotnet ef migrations remove”。或者,在包管理器控制台中运行“Remove-Migration”命令。
希望这有助于并适用于项目中的任何迁移...我仅对最近的迁移进行了测试...
编码愉快!
【讨论】:
这实际上不会取消应用迁移,只是让框架“认为”它尚未应用。如果您这样做,您的数据库将处于不一致的状态。 手动编辑 __EFMigrationsHistory 中的数据是一个糟糕的建议。不要这样做。该表仅供迁移工具在后台使用。如果您开始手动编辑数据,一个错误可能会在您的项目中产生各种疯狂的意外行为。使用其他推荐的解决方案之一是一个更好的主意。 我们遇到过这样一种情况,一名初级团队成员对切换分支感到困惑,并最终从这两个分支中手动删除了迁移(尽管它仍然在 __EFMigrationsHistory 表中,因为它已经应用了),所以我们丢了“倒”。这就是我们最终不得不做的,加上 SSMS 中的一些手动反转。所以不要这样做——除非你此时别无选择。至少他所做的只是添加了一个新字段。【参考方案10】:通常,如果您使用包管理器控制台,删除特定迁移的正确方法是引用迁移的名称
Update-Database -Migration Name of Migration -Context context
根据docs 删除您上次应用的迁移的另一种方法是使用以下命令:
dotnet ef migrations remove
此命令应从解决方案目录中的开发人员命令提示符 (how to open command prompt) 执行。
例如,如果您的应用程序位于名称“Application”内并且位于文件夹 c:\Projects 中。那么你的路径应该是:
C:\Projects\Application
【讨论】:
问题是,如果 `dotnet ef migrations remove' 返回错误“迁移已应用于数据库”,该怎么办【参考方案11】:要恢复应用于 DB 的所有迁移,只需运行:
update-database 0
之后应该运行Remove-Migration
的次数与迁移目录中可见的迁移文件一样多。该命令会删除最新的迁移并更新快照。
【讨论】:
【参考方案12】:更多细节和解决方案在这里:
我不明白为什么我们在这里搞混了。 所以我会写一个清晰的解释,以及你需要注意的内容。
所有命令都将使用dotnet
编写。
此解决方案是为 .net Core 3.1 提供的,但也应与所有其他代兼容
删除迁移:
删除迁移会从您的项目中删除文件(每个人都应该清楚) 只有在迁移未应用于数据库的情况下才能删除迁移 还 删除最后创建的迁移:cd to_your_project
然后dotnet ef migrations remove
注意:仅当您尚未执行 dotnet ef database update
或在您的 c# 代码中调用 Database.Migrate()
时,移除迁移才有效,换句话说,仅当迁移尚未应用于您的数据库时。
取消应用迁移(还原迁移):
从数据库中删除不需要的更改 不会从您的项目中删除迁移文件,但允许您在取消应用后将其删除 要恢复迁移,您可以: 创建一个新的迁移dotnet ef migrations add <your_changes>
并应用它,这是微软推荐的。
或者,使用dotnet ef database update <your_migration_name_to_jump_back_to>
将您的数据库更新到指定的迁移(基本上是取消应用或还原未选择的迁移)
注意:如果您要取消应用的迁移不包含特定的列或表,而这些列或表已在您的数据库中应用并正在使用,则该列或表将被删除,您的数据将丢失.
还原迁移后,您可以删除不需要的迁移
希望这对某人有所帮助!
【讨论】:
在您的最后一条注释中,我想您想说:“如果您在取消应用迁移后想要进行的目标迁移不包含...”或“如果您想要的迁移不适用,不包含"【参考方案13】:dotnet ef database update <the-migration-you-want-to-recover>
dotnet ef migrations remove
不要忘记 remove-Call,因为这将为您删除迁移文件并更新快照文件。
【讨论】:
您的意思是database remove
还是migrations remove
?【参考方案14】:
首先运行以下命令:
PM>update-database -migration:0
然后运行这个:
PM>remove_migration
完成
【讨论】:
【参考方案15】:要在 EF Core 1.0 中取消应用迁移,请使用以下命令:
dotnet ef 数据库更新 migration_name
使用您希望保留更改的迁移的迁移名称。可以使用以下命令找到迁移的名称列表:
dotnet ef 迁移列表
【讨论】:
【参考方案16】:删除迁移
如果上次迁移未应用于数据库,您可以删除它。使用以下删除命令删除最后创建的迁移文件并恢复模型快照。
包管理器控制台
PM> 移除迁移
CLI> dotnet ef 迁移删除
上述命令将删除上一次迁移并将模型快照恢复为上一次迁移。请注意,如果迁移已应用于数据库,则会引发以下异常。
迁移已应用于数据库。还原它并重试。如果迁移已应用于其他数据库,请考虑使用新迁移恢复其更改。
恢复迁移
假设您更改了域类并使用 add-migration 命令创建了名为 MySecondMigration 的第二个迁移,并使用 Update 命令将此迁移应用于数据库。但是,出于某种原因,您希望将数据库恢复到以前的状态。在这种情况下,请使用 update-database 命令将数据库恢复到指定的先前迁移快照。
包管理器控制台
PM> 更新数据库 MyFirstMigration
CLI
dotnet ef 数据库更新 MyFirstMigration。
上述命令将基于名为 MyFirstMigration 的迁移还原数据库,并删除应用于名为 MySecondMigration 的第二个迁移的所有更改。这还将从数据库中的 __EFMigrationsHistory 表中删除 MySecondMigration 条目。
注意:这不会删除与 MySecondMigration 相关的迁移文件。使用 remove 命令将它们从项目中删除。
【讨论】:
【参考方案17】:因为我已被重定向到此问题,以在 ef
而不是 ef core
中搜索回滚迁移,所以我将这个答案添加到每个想在 ef
中了解相同问题的人的问题中.如果您使用ef
,您可以使用以下命令回滚迁移:
Update-Database [[-Migration] <String>]
[-Context <String>]
[-Project <String>]
[-StartupProject <String>]
[<CommonParameters>]
基于问题:
Update-Database -Migration <previous-migration-name> -context BloggingContext
【讨论】:
【参考方案18】:1.找到表“dbo._EFMigrationsHistory”,然后删除要删除的迁移记录。 2. 在 PM(Package Manager Console) 中运行“remove-migration”。 对我有用。
【讨论】:
这会导致数据库的状态不一致(例如一列已经被删除)【参考方案19】:你可以这样做:
dotnet ef migrations remove
警告
注意不要删除任何已应用于生产数据库的迁移。不这样做会阻止您恢复它,并且可能会破坏后续迁移所做的假设。
【讨论】:
请不要重复答案,这没有用。 ***.com/a/55323154/861716以上是关于如何使用 EF Core 在 ASP.NET Core 中取消应用迁移的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色
如何使用 EF Core 代码优先迁移为 ASP.NET Core MVC 配置 N 层架构
如何在现有数据库 ASP.NET Core MVC 和 EF Core(DB-First)中使用 Identity
如何在不使用 EF 的情况下连接到 ASP.NET Core Web API 中的数据库?