我有一个使用TypeORM的项目,我有以下两个实体

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

@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 是一个抽象类,其 id 列为 @PrimaryGeneratedColumn

我有以下代码更新 QueuedEmail 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);
});

现在,select正确加载数组或 QueuedEmailEntity 对象, foreach 运行但抛出以下异常

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"

调试查询输出显示TypeORM正在更新 status 字段,但也更新 emailId' and then attempting to delete the EmailEntity`记录

UPDATE "QueuedEmail" SET "status"=$1, "emailId"=$2 WHERE "id"=$3 -- PARAMETERS: [1,1,1]
DELETE FROM "Email" WHERE "id"=$1 -- PARAMETERS: [1]

我不明白为什么当我没有更改引用时,TypeORM需要更新 emailId 字段,更不用说为什么它会尝试删除仍然引用的记录 . 任何人都可以看到上面的代码有什么问题?