gpt4 book ai didi

mysql - TypeORM 存储库创建不设置值

转载 作者:可可西里 更新时间:2023-11-01 08:58:26 25 4
gpt4 key购买 nike

这是我的实体:

@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 - 创建 User 的新实例。可选择接受具有用户属性的对象文字,这些属性将被写入新创建的用户对象。

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";

注意事项

我尝试将类的属性设置为公开,然后 create 正常工作,但是当它们是私有(private)的并且我使用 getters/setters 时,它不起作用。

最佳答案

我从未见过任何 ORM(在任何语言中)会使用对象私有(private)字段作为数据字段。为什么会有这样的期望?除了特定的类实例之外,私有(private)字段在任何其他代码中都是不可见的。所以,ORM 不会意识到它们,因此你不应该用装饰器/属性来标记它们,这没有任何意义。即使 ORM 可以找到私有(private)属性,它又如何猜测哪个 getter/setter 应该与属性 _name 或任何其他属性一起使用?

docs他们建议只使用具有普通公共(public)属性的类,如下所示:

@Entity()
export class User {

@PrimaryGeneratedColumn()
id: number;

@Column()
firstName: string;

@Column()
lastName: string;
}

而且这似乎是目前唯一正确的方法。

关于mysql - TypeORM 存储库创建不设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51860432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com