node.js - TypeORM - Oppdatering med OneToOne-tilkobling forsøker å slette relaterte poster
Jeg har et prosjekt som bruker TypeORM, og jeg har de følgende to entitetene:
@Entity("Email")
export class EmailEntity extends BaseEntity implements IEmail {
@Column({length: 100}) to: string;
@Column({length: 100}) from: string;
@Column({length: 255}) subject: string;
@Column({nullable: true}) html: string;
@Column({nullable: true}) text: string;
}
og
@Entity("QueuedEmail")
export class QueuedEmailEntity extends BaseEntity implements IQueuedEmail {
@OneToOne(email => EmailEntity, {nullable: false, cascadeAll: true})
@JoinColumn()
email: EmailEntity;
@Column() retryCount: number;
@Column() status: QueuedEmailStatus;
constructor() {
super();
this.retryCount = 0;
this.status = QueuedEmailStatus.QueuedForDispatch;
}
}
BaseEntity er en abstrakt klasse som har en id-kolonne med @PrimaryGeneratedColumn.
Jeg har følgende kode som oppdaterer status på en QueuedEmail:
const queuedEmailEntityArray: QueuedEmailEntity[] =
await this.queuedEmailRepository.createQueryBuilder("queuedEmail")
.where("queuedEmail.status = :queuedEmailStatus", {queuedEmailStatus: QueuedEmailStatus.QueuedForDispatch})
.innerJoinAndSelect("queuedEmail.email", "email")
.orderBy("queuedEmail.id", "DESC")
.getMany();
queuedEmailEntityArray.forEach(async (value, index) => {
let queuedEmailEntity: QueuedEmailEntity = queuedEmailEntityArray.pop();
queuedEmailEntity.status = QueuedEmailStatus.AttemptingToDispatch;
await this.queuedEmailRepository.persist(queuedEmailEntity);
});
Nå laster select riktig inn arrayet eller QueuedEmailEntity-objektene, forEach kjører, men kaster følgende unntak:
query failed: DELETE FROM "Email" WHERE "id"=$1 -- PARAMETERS: [1] error during executing query:error: update or delete on table "Email" violates foreign key constraint "fk_d438362cf2adecbcc5b17f45606" on table "QueuedEmail"
Debuggspørringsutdataene viser at TypeORM oppdaterer status-feltet, men også oppdaterer emailId og deretter forsøker å slette EmailEntity-posten.
UPDATE "QueuedEmail" SET "status"=$1, "emailId"=$2 WHERE "id"=$3 -- PARAMETERS: [1,1,1]
DELETE FROM "Email" WHERE "id"=$1 -- PARAMETERS: [1]
Jeg forstår ikke hvorfor TypeORM skulle trenge å oppdatere emailId-feltet når jeg ikke har endret referansen, langt mindre hvorfor det skulle prøve å slette en post som fortsatt er referert. Kan noen se hva som er galt med koden ovenfor?