{
  "id": "ai-generates-invalid-prisma-relations",
  "type": "failures",
  "category": "failures",
  "locale": "es",
  "url": "/es/failures/ai-generates-invalid-prisma-relations",
  "title": "Cómo corregir relaciones inválidas de Prisma generadas por IA",
  "description": "Los agentes de IA generan relaciones de esquema Prisma con relaciones inversas faltantes, acciones referenciales incorrectas o tipos de campo no coincidentes que fallan en prisma validate y prisma migrate.",
  "tools": [
    "Cursor",
    "Claude Code",
    "Codex",
    "Windsurf"
  ],
  "stack": [
    "PostgreSQL",
    "TypeScript"
  ],
  "tags": [
    "prisma",
    "postgres",
    "sql"
  ],
  "difficulty": null,
  "updated": "2026-06-08",
  "markdown": "El agente escribe un esquema Prisma con relaciones que parecen correctas pero fallan\nen `prisma validate` debido a referencias inversas faltantes, tipos no coincidentes o\nconfiguraciones ambiguas de múltiples relaciones.\n\n## El síntoma\n\nSe declara una relación en un modelo sin su contraparte requerida en el otro,\no el tipo del campo de clave foránea no coincide con el campo referenciado.\n\n```prisma\n// schema.prisma — WRONG\nmodel User {\n  id    String @id @default(cuid())\n  posts Post[]\n}\n\nmodel Post {\n  id       String @id @default(cuid())\n  authorId Int    // Int, but User.id is String — type mismatch\n  // Missing: author User @relation(fields: [authorId], references: [id])\n}\n```\n\nEjecutar `prisma validate` produce:\n\n```\nError: The relation field `posts` on model `User` is missing an opposite\nrelation field on the model `Post`.\n```\n\n## Por qué ocurre\n\nEl agente a menudo escribe un lado de una relación y se olvida de agregar el otro,\nespecialmente en casos de muchos a muchos o autorreferenciales. También copia tipos\nde campo de memoria sin verificar que `authorId` debe coincidir exactamente con el tipo\n`id` de referencia.\n\n## Cómo detectarlo\n\n- `prisma validate` o `prisma migrate dev` falla con un error de relación.\n- Un modelo tiene un campo de arreglo (uno a muchos) pero el modelo referenciado no tiene\n  clave foránea escalar o atributo `@relation`.\n- Muchos a muchos usa tablas de unión explícitas con tipos no coincidentes.\n- Modelos autorreferenciales (ej. árboles de categorías) tienen solo un lado del par\n  `@relation(name: \"...\")`.\n\n## Cómo corregirlo\n\nCada relación debe tener ambos lados declarados. Los tipos escalares de clave foránea deben\ncoincidir exactamente con el tipo del campo referenciado.\n\n```prisma\n// schema.prisma — CORRECT\nmodel User {\n  id    String @id @default(cuid())\n  posts Post[] // one-to-many: back-reference\n}\n\nmodel Post {\n  id       String @id @default(cuid())\n  authorId String                       // String, matches User.id\n  author   User   @relation(fields: [authorId], references: [id], onDelete: Cascade)\n}\n```\n\nPara un árbol autorreferencial:\n\n```prisma\nmodel Category {\n  id       String     @id @default(cuid())\n  parentId String?\n  parent   Category?  @relation(\"CategoryTree\", fields: [parentId], references: [id])\n  children Category[] @relation(\"CategoryTree\")\n}\n```\n\n```txt\n[ ] Run \"prisma validate\" before \"prisma migrate dev\" — fix all errors first\n[ ] Every @relation on model A has a matching field on model B\n[ ] Foreign key scalar type matches the referenced @id type (String/Int/cuid)\n[ ] Self-referential relations use a named @relation(\"name\") on both sides\n[ ] Explicit many-to-many join tables declare both foreign keys with onDelete\n[ ] onDelete referential action is explicit (Cascade, Restrict, SetNull) — not left to default\n```\n\n## Prompt de corrección\n\n```txt title=\"Fix Prompt\"\nThis Prisma schema fails prisma validate. Fix every relation error: add the\nmissing back-reference fields, ensure all foreign key scalar types exactly match\nthe referenced @id type, give every self-referential relation a unique name on\nboth sides, and set explicit onDelete actions (Cascade for required relations,\nSetNull for optional). Run prisma validate after each change until it passes.\n```\n\n## Prueba\n\n```bash\n# Validate schema before attempting migration\nnpx prisma validate && echo \"Schema OK\" || echo \"FAIL: schema invalid\"\n\n# Also check for type mismatches (Int fk -> String id is a common error)\ngrep -A3 \"@relation\" prisma/schema.prisma\n```"
}