TypeORM 存储库创建不设置值
TypeORM repository create not setting values
这是我的实体:
@Entity()
export class Game extends BaseEntity {
@PrimaryGeneratedColumn({
name: "id",
})
private _id: number;
@Column({
name: "name",
type: "varchar",
nullable: false,
})
private _name: string;
get id(): number {
return this._id;
}
set id(id: number) {
this._id = id;
}
get name(): string {
return this._name;
}
set name(name: string) {
this._name = name;
}
}
当我尝试创建新游戏时,我想使用 Repository API。
所以我做的是:
import { getRepository } from "typeorm";
import { Game } from "../entities/game.entity";
import { InsertGameConfig } from "../interfaces/entities/game";
public async insert(config: InsertGameConfig) {
return await getRepository(Game).create(config).save();
}
并像这样调用插入函数:
await insert({
name: "test",
});
但是当我查看 mysql 查询日志时,我发现:
INSERT INTO `game`(`id`, `name`) VALUES (DEFAULT, DEFAULT)
但是,如果我创建实例并像这样设置每个值:
const game = new Game();
game.name = config.name;
return await game.save();
然后它就可以正常工作了,所以:
INSERT INTO `game`(`id`, `name`) VALUES (DEFAULT, "test")
来自 TypeOrm 文档:
create
- 创建用户的新实例。可选择接受具有用户属性的对象文字,这些属性将被写入新创建的用户对象。
const user = repository.create(); // same as const user = new User();
const user = repository.create({
id: 1,
firstName: "Timber",
lastName: "Saw"
}); // same as const user = new User(); user.firstName = "Timber"; user.lastName = "Saw";
备注
我尝试设置 class 的属性 public,然后 create
可以正常工作,但是当它们是私有的并且我使用 getters/setters 时,它不会工作。
我从未见过任何 ORM(以任何语言)将对象私有字段用作数据字段。为什么会有这样的期望?除了特定的 class 实例之外,任何其他代码都看不到私有字段。所以,ORM 不会知道它们,因此你不应该用 decorators/attributes 标记它们,这没有任何意义。即使 ORM 可以找到私有属性,它如何猜测哪个 getter/setter 应该与 属性 _name
或任何其他一起使用?
在 docs 中,他们建议只使用 classes 和普通 public 属性,如下所示:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
}
这似乎是目前唯一正确的方法。
这是我的实体:
@Entity()
export class Game extends BaseEntity {
@PrimaryGeneratedColumn({
name: "id",
})
private _id: number;
@Column({
name: "name",
type: "varchar",
nullable: false,
})
private _name: string;
get id(): number {
return this._id;
}
set id(id: number) {
this._id = id;
}
get name(): string {
return this._name;
}
set name(name: string) {
this._name = name;
}
}
当我尝试创建新游戏时,我想使用 Repository API。
所以我做的是:
import { getRepository } from "typeorm";
import { Game } from "../entities/game.entity";
import { InsertGameConfig } from "../interfaces/entities/game";
public async insert(config: InsertGameConfig) {
return await getRepository(Game).create(config).save();
}
并像这样调用插入函数:
await insert({
name: "test",
});
但是当我查看 mysql 查询日志时,我发现:
INSERT INTO `game`(`id`, `name`) VALUES (DEFAULT, DEFAULT)
但是,如果我创建实例并像这样设置每个值:
const game = new Game();
game.name = config.name;
return await game.save();
然后它就可以正常工作了,所以:
INSERT INTO `game`(`id`, `name`) VALUES (DEFAULT, "test")
来自 TypeOrm 文档:
create
- 创建用户的新实例。可选择接受具有用户属性的对象文字,这些属性将被写入新创建的用户对象。
const user = repository.create(); // same as const user = new User();
const user = repository.create({
id: 1,
firstName: "Timber",
lastName: "Saw"
}); // same as const user = new User(); user.firstName = "Timber"; user.lastName = "Saw";
备注
我尝试设置 class 的属性 public,然后 create
可以正常工作,但是当它们是私有的并且我使用 getters/setters 时,它不会工作。
我从未见过任何 ORM(以任何语言)将对象私有字段用作数据字段。为什么会有这样的期望?除了特定的 class 实例之外,任何其他代码都看不到私有字段。所以,ORM 不会知道它们,因此你不应该用 decorators/attributes 标记它们,这没有任何意义。即使 ORM 可以找到私有属性,它如何猜测哪个 getter/setter 应该与 属性 _name
或任何其他一起使用?
在 docs 中,他们建议只使用 classes 和普通 public 属性,如下所示:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
}
这似乎是目前唯一正确的方法。