Prisma+MongoDB一对多与多对多关联异常:仅单向生效
Prisma + MongoDB 双向关联同步问题解决方案
你当前的模型是手动维护多对多关联的ID数组,Prisma不会自动帮你同步两端的关联数据,所以更新owner时只有owner的propertyId数组更新,对应的property的ownerId数组没变化。下面给两种解决办法:
办法一:用Prisma隐式多对多关联(推荐)
这种方式下Prisma会自动处理双向关联的同步,不需要你手动维护ID数组。修改后的模型如下:
model owner { ownerId String @id @default(auto()) @map("_id") @db.ObjectId property property[] @relation("OwnerProperty") propertyrole propertyrole[] } model property { propertyId String @id @default(auto()) @map("_id") @db.ObjectId owner owner[] @relation("OwnerProperty") propertyrole propertyrole[] }
去掉手动的propertyId和ownerId数组,给双向关联指定同一个名称OwnerProperty,Prisma会自动在MongoDB的文档中维护对应的关联ID数组,并且在你更新关联时自动同步两端的数据。比如你用Prisma Client创建或更新owner的关联property时,对应的property文档里的owner关联也会自动更新。
办法二:手动同步两端数据(适合自定义关联逻辑场景)
如果一定要保留手动维护ID数组的方式,更新时必须手动操作两端,最好用事务保证原子性,避免出现一端更新成功另一端失败的情况。示例代码如下:
// 给指定owner添加关联property的示例 const updateOwnerAndProperty = async (ownerId: string, propertyId: string) => { await prisma.$transaction([ // 更新owner的propertyId数组,新增关联ID prisma.owner.update({ where: { ownerId }, data: { propertyId: { push: propertyId } } }), // 同步更新property的ownerId数组,新增关联ID prisma.property.update({ where: { propertyId }, data: { ownerId: { push: ownerId } } }) ]); };
通过Prisma事务同时执行两个更新操作,确保owner和property的关联数组同时被修改,保证双向关联的一致性。
内容的提问来源于stack exchange,提问作者Jayakrishnan MK
相关产品推荐
相关产品推荐

