0

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

2 回答 2

1

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

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

于 2021-06-24T03:11:21.313 回答
0

更新

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

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


您执行的步骤如下:

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

如果您之前修改了 Task 类而不运行迁移命令,您最终将拥有 2 个带有 create task table 命令的迁移文件,因为在任何迁移发生之前 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以使用枚举更改数据库上的任务表
于 2021-06-02T16:37:20.820 回答