【问题标题】:The name 'Initial' is used by an existing migration现有迁移使用名称“初始”
【发布时间】:2021-02-10 14:07:13
【问题描述】:

我有这样的配置: ABP 框架:4.2.1 用户界面:MVC 数据库提供者:EF Core / PostgreSQL 例外:现有迁移使用名称“初始”。

当我开始一个新项目并在 DbMigrator 中运行命令 dotnet run 时,出现错误:现有迁移使用了名称“初始”。

在迁移文件夹中,我只有一个初始迁移

【问题讨论】:

  • DbMigrator 不是每次都调用dotnet ef migrations add Initial 吗?如果不删除现有迁移,您将无法创建新迁移(称为Initial)。检查你的DbMigrator,也许显示一些代码。
  • @BenceL 我试图删除现有的迁移,但我得到了同样的错误 =/
  • 你是通过dotnet ef migrations remove删除的吗?还是直接删了?您应该使用该工具。
  • @BenceL,是的!通过 CLI ;)
  • 这一定是一个如此明显的错误,但我看不到它(这让我抓狂yyy...)。你能告诉我你的DbMigrator 代码吗?至少它的一部分和它的作用。您确定这是正确的目录并且DbMigrator 不会在不同的地方创建它(发生错误)。很抱歉有明显的问题,但我不知道如何解决这个问题。如果您(或您公司)的政策允许,将它上传到 github 可能是个好主意,这样我就可以测试它(您不太可能上传它,但值得一试)。

标签: asp.net .net-core entity-framework-migrations abp


【解决方案1】:

我不知道我是否可以给你一个明确的答案,但它来了。首先,我什至没有意识到这个 ABP 框架为您提供了一个完整的模板来工作。我用你在 cmets 中给我的参数创建了一个。

当我查看代码时,DbMigrator 调用方法 <ProjectName>DbMigrationService.AddInitialMigration(),当框架找不到 Migrations 文件夹时调用此方法(并且迁移项目存在但它是由框架生成的,所以它存在)。这种方法对我没有任何作用(可能我不知道权限不够),但本质上它只是调用abp cli 命令来生成第一次迁移。所以我手动运行它。

这运行成功(我认为在你的情况下)。如果我再次尝试运行它,它显然会失败。此命令仅应用于Initial 迁移(基本上框架已预定义表并为其生成迁移)。

我第二次运行DbMigrator(实际调试它),发现这次没有为我调用AddInitialMigration(这是正确的)。我做了一点谷歌搜索abp create new migration 第一个结果,向下滚动了很多(你可以搜索Add-Migration 并阅读第一场比赛)。该文档说明了一个示例(我显然没有阅读它),但它有一个基本句子。 Now, you can add a new EF Core database migration using the standard Add-Migration command...,这句话告诉我必须通过 dotnet cli 创建新的迁移。所以我创建了它(请原谅版本警告)。

然后我通过dotnet run 运行DbMigrator,瞧,新的迁移在数据库中。

所以我的结论:这是一个花哨的框架,我喜欢代码生成,但这对我来说太多了,它生成的东西太多了,很多没有多年经验的人只会迷路。

那么如何生成迁移?

  1. 以您想要的方式修改您的 Context 类和实体。
  2. 通过dotnet ef migrations add <migration_name> 手动创建迁移,确保您位于<ProjectName>.EntityFrameworkCore.DbMigrations 文件夹中。
  3. 通过dotnet run 命令运行DbMigrator

我希望这会有所帮助。 :D

编辑:如果您的DbMigrator 仍然失败,那么我建议您调试代码,并查看它尝试执行的命令:

var procStartInfo = new ProcessStartInfo(fileName, $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetDbMigrationsProjectFolderPath()}\"\"");

procStartInfo(对我来说是第 143 行),将包含实际命令,abp create-migration ... 查看路径它选择并从该文件夹中清除 Migrations 文件夹,然后重试。

【讨论】:

  • 感谢您的精彩解释!我制作了一个视频来说明我的问题:youtu.be/Vk3d_d4yFRs 请看一下;)
  • 我认为那里有问题,您可以看到Creating initial migration 被打印了两次。我不知道是什么原因造成的,但我认为这应该不是问题(正如我所看到的那样,Initial 迁移已正确创建)。如果你运行一次,然后再次运行而不删除文件,你会得到同样的错误吗?另外,请尝试使用外部终端,而不是 Rider 中的终端。
【解决方案2】:

我在 Ubuntu 上遇到了同样的问题。原因原来是 Linux 区分大小写。在文件*DbMigrationService.cs 中,将“迁移”更改为“迁移”即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2015-07-05
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多