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

Nestjs 不允许重复的实体名称-Mikro Orm,nestjs,mikro-orm,Nestjs,Mikro Orm,我在Mikro Orm中为一个实体创建了一个迁移。之后,我修改了实体并再次运行迁移。现在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

我在Mikro Orm中为一个实体创建了一个迁移。之后,我修改了实体并再次运行迁移。现在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) 
这是我的实体

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

  @Property()
  name: string;

  @Property()
  description: string;
}
在那之后,我运行了两个命令
npxmikroormmigration:create
npxmikroormmigration: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\u模块
,然后重新安装


您执行的步骤如下所示:

  • 创建一个任务类
  • 创建迁移文件
  • 修改任务类
  • 再次创建迁移文件
  • 迁移
  • 如果您在没有运行迁移命令的情况下修改了任务类,那么在执行任何迁移之前,mikro没有任务表的任何引用,因此使用create Task table命令将得到2个迁移文件

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

    因此,有一种解决方法:

    • 首先删除第二个迁移文件
    • 运行
      npx mikro orm migration:up
      在没有枚举的数据库上创建任务表
    • 运行npx mikro orm迁移:创建
    。 现在,mikro有任务表的引用,并且知道您想要更改表,所以迁移中的SQL将是
    altertable task
    ,而不是
    create table

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

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


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

      迁移不是问题。在最后一次迁移之前,我应用了以前的迁移,甚至将数据插入到数据库中。但是您能否确认迁移文件正在使用
      altertable
      SQL而不是
      createtable
      ?我已经检查了数据库,它正在使用altertable命令。数据库中的表有taskStatus列,甚至包含以前的数据。我甚至运行了npx mikro orm migration:pending命令来检查是否有任何迁移处于挂起状态,但它表示没有任何迁移处于挂起状态,所以您的意思是可以成功应用更改,但仍然显示
      不允许重复的实体名称:Task
      错误?嘿,谢谢您签出我的代码。我删除了我的
      node\u模块
      dist
      文件夹。然后它开始告诉我错误,它找不到
      mikro orm.config.js
      。因此,我将它的新路径更新为
      /dist/src/mikro orm.config.js
      ,代码现在开始工作。再次感谢你帮助我。您应该编辑您的答案,以便我可以将其标记为已回答。