不允许使用重复的实体名称 - Mikro Orm

问题描述

我在 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) 

解决方法

更新

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

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


您执行的步骤如下:

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

如果您之前没有运行迁移命令而修改任务类,那么您最终将使用 create task table 命令获得 2 个迁移文件,因为在任何迁移发生之前,mikro 没有任何任务表的引用。

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

所以有办法解决:

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

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

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

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

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