【问题标题】:Duplicate entity names are not allowed - Mikro Orm不允许重复的实体名称 - Mikro Orm
【发布时间】:2021-08-20 17:02:05
【问题描述】:

我在 Mikro Orm 中为实体创建了迁移。之后,我修改了实体并再次运行迁移。现在nestjs一直给我这个错误。

这是我的实体。

@Entity()
export class Task extends BaseEntity<Task, 'id'> {
  @PrimaryKey()
  id: number;

  @Property()
  name: string;

  @Property()
  description: string;
}

我使用npx mikro-orm migration:create --initial 创建了初始迁移。之后我将我的实体修改为:

@Entity()
export class Task extends BaseEntity<Task, 'id'> {
  @PrimaryKey()
  id: number;

  @Property()
  name: string;

  @Property()
  description: string;

  @Enum(() => TaskStatus)
  status: TaskStatus = TaskStatus.OPEN;
}

export enum TaskStatus {
  OPEN = 'OPEN',
  IN_PROGRESS = 'IN_PROGRESS',
  DONE = 'DONE',
}

之后,我运行了两个命令npx mikro-orm migration:createnpx mikro-orm migration:up。 现在 NestJs 一直给我这个错误。

[Nest] 13528   - 02/06/2021, 6:59:14 pm   [NestFactory] Starting Nest application...
[Nest] 13528   - 02/06/2021, 6:59:14 pm   [InstanceLoader] MikroOrmModule dependencies initialized +43ms 
[Nest] 13528   - 02/06/2021, 6:59:14 pm   [InstanceLoader] ConfigHostModule dependencies initialized +1ms
[Nest] 13528   - 02/06/2021, 6:59:14 pm   [InstanceLoader] AppModule dependencies initialized +1ms
[Nest] 13528   - 02/06/2021, 6:59:14 pm   [InstanceLoader] ConfigModule dependencies initialized +0ms
[Nest] 13528   - 02/06/2021, 6:59:14 pm   [ExceptionHandler] Duplicate entity names are not allowed: Task +409ms      
MetadataError: Duplicate entity names are not allowed: Task
    at Function.duplicateEntityDiscovered (C:\dev\nodejs\nestjs\sandbox\node_modules\@mikro-orm\core\errors.js:151:16)    at MetadataValidator.validateDiscovered (C:\dev\nodejs\nestjs\sandbox\node_modules\@mikro-orm\core\metadata\MetadataValidator.js:40:42)
    at MetadataDiscovery.findEntities (C:\dev\nodejs\nestjs\sandbox\node_modules\@mikro-orm\core\metadata\MetadataDiscovery.js:81:24)
    at processTicksAndRejections (node:internal/process/task_queues:93:5)
    at async MetadataDiscovery.discover (C:\dev\nodejs\nestjs\sandbox\node_modules\@mikro-orm\core\metadata\MetadataDiscovery.js:34:9)
    at async Function.init (C:\dev\nodejs\nestjs\sandbox\node_modules\@mikro-orm\core\MikroORM.js:42:24)
    at async Injector.instantiateClass (C:\dev\nodejs\nestjs\sandbox\node_modules\@nestjs\core\injector\injector.js:290:37)
    at async callback (C:\dev\nodejs\nestjs\sandbox\node_modules\@nestjs\core\injector\injector.js:42:30)
    at async Injector.resolveConstructorParams (C:\dev\nodejs\nestjs\sandbox\node_modules\@nestjs\core\injector\injector.js:114:24)
    at async Injector.loadInstance (C:\dev\nodejs\nestjs\sandbox\node_modules\@nestjs\core\injector\injector.js:46:9) 

【问题讨论】:

    标签: nestjs mikro-orm


    【解决方案1】:

    我也遇到了这个问题,我知道我没有重复的型号名称。将模型移动到其他目录后出现问题。

    解决方案是清除 dist 构建文件夹和 temp 元数据文件夹。

    【讨论】:

      【解决方案2】:

      更新

      经过调查,代码可以完美运行。 node_modules 可能存在一些问题,其中存在一些不完整/不兼容的包。

      解决方法是删除node_modules并重新安装。


      您执行的步骤如下:

      1. 创建一个任务类
      2. 创建迁移文件
      3. 修改Task类
      4. 再次创建迁移文件
      5. 进行迁移

      如果你之前修改了Task类而不运行迁移命令,你最终会得到2个带有create task table命令的迁移文件,因为mikro在任何迁移发生之前没有任何任务表的引用。

      您可以检查两个迁移文件中的 SQL,它应该是 create table task xxx

      因此,有办法解决:

      • 先删除第二个迁移文件
      • 运行npx mikro-orm migration:up在没有枚举的DB上创建任务表
      • 运行npx mikro-orm migration:create

        现在,mikro 有任务表的引用,并且知道您要更改表,因此迁移中的 SQL 将是 alter table task 而不是 create table

      • 运行 npx mikro-orm migration:up 以使用枚举更改 DB 上的任务表

      【讨论】:

      • 迁移不是问题。在最终迁移之前,我应用了之前的迁移,甚至将数据插入到数据库中。 github.com/mikro-orm/mikro-orm/issues/1897
      • 但是您能否确认迁移文件使用的是alter table SQL 而不是create table
      • 我检查了数据库,它正在使用alter table 命令。数据库中的表有 taskStatus 列,甚至包含以前的数据。我什至已经运行了 npx mikro-orm migration:pending 命令来检查是否有任何迁移处于挂起状态,但它说没有迁移处于挂起状态,
      • 那么您的意思是更改可以成功应用但仍然显示Duplicate entity names are not allowed: Task 错误?
      • 您好,感谢您查看我的代码。我删除了我的 node_modulesdist 文件夹。然后它开始给我错误,它找不到mikro-orm.config.js。所以,我更新了./dist/src/mikro-orm.config.js 的新路径,代码现在开始工作了。再次感谢您帮助我。您应该编辑您的答案,以便我可以将其标记为已回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多