From 3b8dcf3af6706a4c3f4f528ce6b3b55f5661b650 Mon Sep 17 00:00:00 2001 From: "soroush.asadi" Date: Tue, 2 Jun 2026 02:11:42 +0330 Subject: [PATCH] fix(seed): dedupe plans by Tier and features by Key (hotfix crash-loop) The previous change deduped on Id, but the unique constraints are on PlatformPlanDefinitions.Tier and PlatformFeatures.Key. Prod's existing Free plan has a different Id, so seeding re-inserted a Free-tier row and crashed on IX_PlatformPlanDefinitions_Tier (23505), crash-looping the API. Now skips any tier/key that already exists. Co-Authored-By: Claude Opus 4.8 --- .../Data/PlatformDataSeeder.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Meezi.Infrastructure/Data/PlatformDataSeeder.cs b/src/Meezi.Infrastructure/Data/PlatformDataSeeder.cs index 7005983..a22bde2 100644 --- a/src/Meezi.Infrastructure/Data/PlatformDataSeeder.cs +++ b/src/Meezi.Infrastructure/Data/PlatformDataSeeder.cs @@ -422,9 +422,12 @@ public static class PlatformDataSeeder } }; - var existingIds = (await db.PlatformPlanDefinitions.Select(p => p.Id).ToListAsync()) - .ToHashSet(StringComparer.Ordinal); - var missing = plans.Where(p => !existingIds.Contains(p.Id)).ToArray(); + // Tier (not Id) carries the unique constraint, so dedupe on Tier — an + // existing Free plan may have a different Id, and inserting another + // Free-tier row would violate IX_PlatformPlanDefinitions_Tier. + var existingTiers = (await db.PlatformPlanDefinitions.Select(p => p.Tier).ToListAsync()) + .ToHashSet(); + var missing = plans.Where(p => !existingTiers.Contains(p.Tier)).ToArray(); if (missing.Length == 0) return; db.PlatformPlanDefinitions.AddRange(missing); @@ -459,9 +462,10 @@ public static class PlatformDataSeeder F("discover_profile", "پروفایل کشف", "Discover profile", "growth") }; - var existingIds = (await db.PlatformFeatures.Select(f => f.Id).ToListAsync()) + // Key carries the unique constraint, so dedupe on Key (not Id). + var existingKeys = (await db.PlatformFeatures.Select(f => f.Key).ToListAsync()) .ToHashSet(StringComparer.Ordinal); - var missing = features.Where(f => !existingIds.Contains(f.Id)).ToArray(); + var missing = features.Where(f => !existingKeys.Contains(f.Key)).ToArray(); if (missing.Length == 0) return; db.PlatformFeatures.AddRange(missing);