typescript - Hva er den riktige måten å lage relasjon på i typeorm?


Jeg har to enheter:

@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-objektet finnes allerede i databasen, og jeg vil lage et item med tilknytning til provider.

Koden min er:

        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;

Koden fungerer, men jeg får en Typescript-feil Type 'string' is not assignable to type 'Promise<ProviderEntity>'.. Hva er den riktige måten å sette inn dette på?


Generisk enhetsklasse inneholder kun id

@PrimaryGeneratedColumn('uuid')
id: string;

Svar #1

Jeg tror for å knytte ting ved en relasjons-ID, og ikke et fullstendig relasjonsobjekt, må du legge til relasjons-ID-en i grensesnittet ditt:

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

@Column()
providerId: string

providerId er kolonnen TypeORM bruker for å holde styr på relasjonen internt, du trenger bare å eksponere den offentlig.

Og så setter du enkelt den egenskapen:

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

await this.repository.save(item);

Svar #2

Takk til @alex-wayne som påpekte dette spørsmålet for meg. Til referanse, tilnærmingen han foreslo stammer mest sannsynlig fra denne GitHub-saken. Mer presist dette svaret fra pleerock, hovedbidragsyteren.

Dessuten foretrekker jeg personlig den første tilnærmingen. I praksis, med tillegg av å bruke create-metoden:

const content = 'mockContent';
const providerId = '5be045b1-ef49-4818-b69f-a45c0b7e53';

const provider = new Provider();
provider.id = providerId;
       
const item = this.itemRepository.create({ content, provider })

await this.repository.save(item);

Relaterte artikler