You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@nestjs/typeorm v9.0.1与typeorm v0.3.9时createEntityManager报错

解决TypeORM 0.3.x + NestJS TypeORM 9.x中dataSource.createEntityManager is not a function及withRepository调用异常

问题根源

TypeORM 0.3.x版本对EntityManager、DataSource的API进行了大幅重构:

  • 彻底移除了createEntityManager方法,原功能可通过dataSource.manager直接获取EntityManager实现;
  • 自定义Repository的初始化逻辑变更,不再需要手动创建EntityManager实例;
  • 事务上下文内使用withRepository时,需传入Repository类而非已实例化的对象,否则会出现上下文不匹配。

具体修复步骤

1. 修复自定义Repository的构造函数

原BarRepository中调用了已被移除的createEntityManager,替换为dataSource.manager即可:

import { Injectable } from '@nestjs/common';
import { Repository, DataSource } from 'typeorm';
import { BarEntity } from '../entities/bar.entity';

@Injectable()
export class BarRepository extends Repository<BarEntity> {
  constructor(dataSource: DataSource) {
    // 改用dataSource.manager替代已移除的createEntityManager
    super(BarEntity, dataSource.manager);
  }
}

如果需要基于NestJS自动注入的基础Repository扩展,也可以用以下更简洁的方式:

import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { BarEntity } from '../entities/bar.entity';

@Injectable()
export class BarRepository extends Repository<BarEntity> {
  constructor(
    @InjectRepository(BarEntity)
    private readonly baseRepository: Repository<BarEntity>,
  ) {
    super(baseRepository.target, baseRepository.manager, baseRepository.queryRunner);
  }
}

2. 修复事务中withRepository的调用方式

事务回调内的manager需要创建绑定当前事务上下文的Repository实例,因此要传入Repository类而非已注入的实例:

import { Injectable } from "@nestjs/common";
import { DataSource } from "typeorm";
import { BarRepository } from "./repositories/bar.repository";

@Injectable()
export class BarService {
  constructor(
    private readonly dataSource: DataSource
  ) {}

  async foo() {
    await this.dataSource.transaction(async (manager) => {
      // 传入BarRepository类,让事务manager创建对应上下文的实例
      const barRepository = manager.withRepository(BarRepository);
      // 执行数据库操作,例如:await barRepository.save(...)
      return;
    });
  }
}

若仅需操作实体基础CRUD,也可直接通过实体类获取Repository:

const barRepository = manager.getRepository(BarEntity);

3. 确认Module配置正确性

确保TypeOrmModule.forFeature包含目标实体,自定义Repository已加入providers列表:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BarEntity } from './entities/bar.entity';
import { BarService } from './services/bar.service';
import { BarRepository } from './repositories/bar.repository';

@Module({
  imports: [TypeOrmModule.forFeature([BarEntity])],
  providers: [BarService, BarRepository],
  exports: [BarService],
})
export class BarModule {}

补充说明

TypeORM 0.3.x相较于0.2.x有大量API变更,建议参考官方迁移文档梳理所有适配点。

内容的提问来源于stack exchange,提问作者user18169254

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:00:57