typeorm存储库创建不设置值

wgeznvg7  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(327)

这是我的实体:

@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;
    }
}

当我尝试创建一个新游戏时,我想使用存储库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();
}

像这样调用insert函数:

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

从TypeForm文档: 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";

注意

我试着将类的属性设置为public,然后 create 工作正常,但是当它们是私有的并且我使用getter/setter时,它就不工作了。

daolsyd0

daolsyd01#

我从未见过任何orm(在任何语言中)将对象私有字段用作数据字段。为什么会有人期待呢?除了特定的类示例之外,私有字段在任何其他代码中都不可见。所以,orm不会意识到它们,因此不应该用decorators/属性来标记它们,这没有任何意义。即使orm可以找到私有属性,它如何猜测哪个getter/setter应该与属性一起使用呢 _name 或者其他什么?
在文档中,他们建议只使用具有以下纯公共属性的类:

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;
}

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

相关问题