Files
jobtrackingapp/JobTrackerApi/Migrations/20260718074509_AddCvVariants.cs
T
cesnimda 1430313a20
CI and Deploy / test (push) Successful in 2m19s
CI and Deploy / deploy (push) Failing after 7s
fix(db): provision CV builder + AI workspace tables via the MySQL-safe reconciler
Deploy failed on prod (MariaDB) while the test job was green: backend startup
threw during Database.Migrate(), so deploy.sh's post-deploy health check exited.

Root cause: AddCvVariants/AddAiInteractions were scaffolded against SQLite, so
they bake SQLite type names into their DDL — DateTimeOffset emits `TEXT`, bool/int
emit `INTEGER`, and the PK gets no AUTO_INCREMENT. Run against MariaDB that yields
a structurally wrong table, and the composite index over a TEXT column then trips
"ERROR 1071: Specified key was too long; max key length is 3072 bytes". SQLite
accepts all of it, which is why local/container verification passed.

Fix, following the pattern already used for CareerProfiles/AiWorkspaceNotes:
- both migrations become no-ops; the three tables are reconciler-owned
- reconciler provisions them idempotently per dialect (MySQL: varchar/int
  AUTO_INCREMENT/datetime(6); SQLite: CREATE TABLE IF NOT EXISTS)
- DropMalformedMySqlTable rebuilds a half-built table left by the failed
  migration, guarded on row count so a table with ANY rows is never dropped
- bound the indexed string columns with HasMaxLength so the model matches

Verified against a real MariaDB 11 container: reproduced error 1071, then
confirmed the corrected DDL yields auto_increment PKs, varchar/datetime columns
and all previously-failing indexes. 306 backend tests green; SQLite container
starts clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 20:41:29 +02:00

28 lines
1.0 KiB
C#

using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace JobTrackerApi.Migrations
{
/// <inheritdoc />
public partial class AddCvVariants : Migration
{
// Intentionally a no-op. CvVariants/CvVariantVersions are provisioned by the reconciler in
// StartupInitializationExtensions (idempotent, MySQL-safe: varchar not longtext so MariaDB can
// index PublicSlug/OwnerUserId). The original CreateTable + CREATE INDEX here indexed unbounded
// string columns, which succeeds on SQLite but throws on MariaDB ("BLOB/TEXT column used in key
// specification without a key length"), crashing backend startup on prod. Reconciler-owned now,
// like CareerProfiles/AiWorkspaceNotes. This migration stays recorded so the chain is intact.
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}