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

Duplicate entity names are not allowed - 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:create & npx 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 上可能存在一些问题,其中存在一些 incomplete/incompatible 个软件包。

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


您执行的步骤如下:

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

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

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

所以有办法解决:

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

    Right now, mikro has references of the task table and know that you want to alter table so the SQL in migration will be alter table task instead of create table

  • 运行 npx mikro-orm migration:up 使用枚举
  • 改变数据库上的任务 table

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

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