diff --git a/packages/utils/src/dal/mikro-orm/integration-tests/__tests__/mikro-orm-repository.spec.ts b/packages/utils/src/dal/mikro-orm/integration-tests/__tests__/mikro-orm-repository.spec.ts index a68ffa5da8..733ae3804a 100644 --- a/packages/utils/src/dal/mikro-orm/integration-tests/__tests__/mikro-orm-repository.spec.ts +++ b/packages/utils/src/dal/mikro-orm/integration-tests/__tests__/mikro-orm-repository.spec.ts @@ -385,6 +385,38 @@ describe("mikroOrmRepository", () => { ) }) + it("should clear the parent entity from the one-to-many relation", async () => { + const entity1 = { + id: "1", + title: "en1", + entity2: [{ title: "en2-1", entity1: null }], + } + + await manager1().upsertWithReplace([entity1], { + relations: ["entity2"], + }) + const listedEntities = await manager1().find({ + where: { id: "1" }, + options: { populate: ["entity2"] }, + }) + + expect(listedEntities).toHaveLength(1) + expect(listedEntities[0]).toEqual( + expect.objectContaining({ + id: "1", + title: "en1", + }) + ) + expect(listedEntities[0].entity2.getItems()).toHaveLength(1) + expect(listedEntities[0].entity2.getItems()).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + title: "en2-1", + }), + ]) + ) + }) + it("should only update the parent entity of a one-to-many if relation is not included", async () => { const entity1 = { id: "1", diff --git a/packages/utils/src/dal/mikro-orm/mikro-orm-repository.ts b/packages/utils/src/dal/mikro-orm/mikro-orm-repository.ts index a46d6ed982..93a543de01 100644 --- a/packages/utils/src/dal/mikro-orm/mikro-orm-repository.ts +++ b/packages/utils/src/dal/mikro-orm/mikro-orm-repository.ts @@ -640,6 +640,16 @@ export function mikroOrmBaseRepositoryFactory( Object.assign(normalizedDataItem, { ...joinColumnsConstraints, }) + // Non-persist relation columns should be removed before we do the upsert. + Object.entries(relation.targetMeta?.properties ?? {}) + .filter( + ([_, propDef]) => + propDef.persist === false && + propDef.reference === ReferenceType.MANY_TO_ONE + ) + .forEach(([key]) => { + delete normalizedDataItem[key] + }) }) await this.upsertMany_(manager, relation.type, normalizedData)