首页 > 解决方案 > 如何在 typeorm 中创建关系的正确方法是什么?

问题描述

我有两个实体:

@Entity({ name: 'provider' })
export class ProviderEntity extends GenericEntity {

    @Column()
    name: string;

    @Column()
    description: string;

    @OneToMany(() => ItemEntity, item => item.provider)
    items: Promise<ItemEntity[]>;

}

@Entity({ name: 'item' })
export class ItemEntity extends GenericEntity {

    @Column()
    content: string;

    @ManyToOne(() => ProviderEntity, provider => provider.items)
    provider: Promise<ProviderEntity>;

}

Provider对象已经存在于数据库中,我想item用 realtion 创建到provider.

我的代码是:

        const content = 'mockContent';
        const providerId = '5be045b1-ef49-4818-b69f-a45c0b7e53';
       
        const item = new ItemEntity();
        item.content = content;
        item.provider = providerId; // ERROR

        await this.repository.save(item);
        return item;

它工作的代码,但我得到一个打字稿错误Type 'string' is not assignable to type 'Promise<ProviderEntity>'.。如何插入这个的正确方法是什么?


通用实体类仅包含 id

@PrimaryGeneratedColumn('uuid')
id: string;

标签: typescriptentity-relationshiptypeorm

解决方案


我相信通过关系 ID 关联事物,而不是完整的关系对象,您需要将关系 ID 添加到您的界面:

@ManyToOne(() => ProviderEntity, provider => provider.items)
provider: Promise<ProviderEntity>;

@Column()
providerId: string

providerId是 TypeORM 用于在内部跟踪关系的列,您只需将其公开即可。

然后您只需设置该属性:

const item = new ItemEntity();
item.content = content;
item.providerId = providerId; // set providerId column directly.

await this.repository.save(item);

推荐阅读