如果未在配置文件中设置实体目录,则 TypeORM 无法找到实体
TypeORM cannot find entities if entity directory was not set in configuration files
我正在使用带有休闲配置文件的 TypeORM:ormconfig.json
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "my-secret-pw",
"database": "mytestdb",
}
我的实体文件存储在 ./src/bar/entity 目录中。
我总是收到以下错误:
RepositoryNotFoundError: No repository for "myTable" was found. Looks like this entity is not registered in current "default" connection?
手动添加目录到配置文件时发现Entity:
{
...
"entities": ["src/bar/entity/**/*.ts"]
}
我的实体定义如下:
@Entity('myTable')
export default class MyTable {
@PrimaryGeneratedColumn()
public id: number;
...
如何在不在每个目录的配置文件中手动设置的情况下让 TypeORM 找到那些实体?
您描述的最常见情况是有单独的 entities
目录,其中仅包含实体声明。
{
...
"entities": ["src/bar/entities/**/*.ts"]
}
另一种方法是分别导入每个实体:
import {User} from "./payment/entity/User";
import {Post} from "./blog/entity/Post";
{
...
"entities": [User, Post]
}
如果您不想将所有实体放在同一个地方(即,如果您有模块文件夹并想将实体放在它们关联的模块文件夹中),并且如果您使用的文件命名约定如 foo.entity.ts
、foo.service.ts
等,然后您可以执行以下操作,它会找到源代码树中任何位置的所有实体:
{
...
"entities": ["src/**/*{.entity.ts}"],
}
对我来说答案是
{
...
entities: [join(__dirname, '/../**/**.entity{.ts,.js}')],
}
我在这里找到了例子
https://github.com/nestjs/nest/blob/master/sample/05-sql-typeorm/src/app.module.ts
对我来说,将 src
目录包含到 ormconfig.json
:
也很有帮助
"entities": [
"dist/**/*.entity{.ts,.js}",
"src/**/*.entity{.ts,.js}"
],
为了在开发和生产环境中工作,使用 Nest.js,我必须这样做:
entities: [
this.isProduction() ?
path.join(__dirname, '../**/**.entity{.ts,.js}') : '**/*.entity{.ts,.js}',
],
// ....
private isProduction(): boolean {
const mode = this.configService.get('NODE_ENV');
return mode !== 'development';
}
确保实体文件的名称不是复数。例如,如果您正在创建一个 post 实体文件,它不应该是“posts.entity.ts”,而应该是“post.entity.ts”
我的问题是我的用户实体文件是小写的,当我将它大写时 - 一切正常。
我正在使用带有休闲配置文件的 TypeORM:ormconfig.json
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "my-secret-pw",
"database": "mytestdb",
}
我的实体文件存储在 ./src/bar/entity 目录中。 我总是收到以下错误:
RepositoryNotFoundError: No repository for "myTable" was found. Looks like this entity is not registered in current "default" connection?
手动添加目录到配置文件时发现Entity:
{
...
"entities": ["src/bar/entity/**/*.ts"]
}
我的实体定义如下:
@Entity('myTable')
export default class MyTable {
@PrimaryGeneratedColumn()
public id: number;
...
如何在不在每个目录的配置文件中手动设置的情况下让 TypeORM 找到那些实体?
您描述的最常见情况是有单独的 entities
目录,其中仅包含实体声明。
{
...
"entities": ["src/bar/entities/**/*.ts"]
}
另一种方法是分别导入每个实体:
import {User} from "./payment/entity/User";
import {Post} from "./blog/entity/Post";
{
...
"entities": [User, Post]
}
如果您不想将所有实体放在同一个地方(即,如果您有模块文件夹并想将实体放在它们关联的模块文件夹中),并且如果您使用的文件命名约定如 foo.entity.ts
、foo.service.ts
等,然后您可以执行以下操作,它会找到源代码树中任何位置的所有实体:
{
...
"entities": ["src/**/*{.entity.ts}"],
}
对我来说答案是
{
...
entities: [join(__dirname, '/../**/**.entity{.ts,.js}')],
}
我在这里找到了例子 https://github.com/nestjs/nest/blob/master/sample/05-sql-typeorm/src/app.module.ts
对我来说,将 src
目录包含到 ormconfig.json
:
"entities": [
"dist/**/*.entity{.ts,.js}",
"src/**/*.entity{.ts,.js}"
],
为了在开发和生产环境中工作,使用 Nest.js,我必须这样做:
entities: [
this.isProduction() ?
path.join(__dirname, '../**/**.entity{.ts,.js}') : '**/*.entity{.ts,.js}',
],
// ....
private isProduction(): boolean {
const mode = this.configService.get('NODE_ENV');
return mode !== 'development';
}
确保实体文件的名称不是复数。例如,如果您正在创建一个 post 实体文件,它不应该是“posts.entity.ts”,而应该是“post.entity.ts”
我的问题是我的用户实体文件是小写的,当我将它大写时 - 一切正常。