diff --git a/src/JobsMedical.Web/Data/SeedData.cs b/src/JobsMedical.Web/Data/SeedData.cs
index 43ce754..d90d3c9 100644
--- a/src/JobsMedical.Web/Data/SeedData.cs
+++ b/src/JobsMedical.Web/Data/SeedData.cs
@@ -10,12 +10,42 @@ namespace JobsMedical.Web.Data;
///
public static class SeedData
{
+ /// Canonical role taxonomy (name, category, sort). Add new roles here; they're
+ /// inserted on every startup if missing, so existing DBs pick them up too.
+ private static readonly (string Name, string Category, int SortOrder)[] CanonicalRoles =
+ {
+ ("پزشک عمومی", "پزشک", 1),
+ ("پزشک متخصص", "پزشک", 2),
+ ("پرستار", "پرستار", 3),
+ ("ماما", "ماما", 4),
+ ("تکنسین اتاق عمل", "تکنسین", 5),
+ ("تکنسین فوریتهای پزشکی", "تکنسین", 6),
+ ("کارشناس آزمایشگاه", "تکنسین", 7),
+ ("دندانپزشک", "دندانپزشک", 8),
+ ("پرستار سالمندان", "پرستار", 9),
+ };
+
public static async Task EnsureSeededAsync(AppDbContext db, bool includeDemo = true)
{
await SeedReferenceAsync(db);
+ await EnsureRolesAsync(db);
if (includeDemo) await SeedDemoAsync(db);
}
+ /// Idempotently add any canonical role missing from the DB (no-op when all present).
+ public static async Task EnsureRolesAsync(AppDbContext db)
+ {
+ var existing = await db.Roles.Select(r => r.Name).ToListAsync();
+ var added = false;
+ foreach (var (name, category, sort) in CanonicalRoles)
+ if (!existing.Contains(name))
+ {
+ db.Roles.Add(new Role { Name = name, Category = category, SortOrder = sort, IsActive = true });
+ added = true;
+ }
+ if (added) await db.SaveChangesAsync();
+ }
+
// ---------- Reference data (always) ----------
public static async Task SeedReferenceAsync(AppDbContext db)
{
@@ -29,14 +59,7 @@ public static class SeedData
new City { Name = "شیراز", Province = "فارس", IsActive = false });
await db.SaveChangesAsync();
- db.Roles.AddRange(
- new Role { Name = "پزشک عمومی", Category = "پزشک", SortOrder = 1 },
- new Role { Name = "پزشک متخصص", Category = "پزشک", SortOrder = 2 },
- new Role { Name = "پرستار", Category = "پرستار", SortOrder = 3 },
- new Role { Name = "ماما", Category = "ماما", SortOrder = 4 },
- new Role { Name = "تکنسین اتاق عمل", Category = "تکنسین", SortOrder = 5 },
- new Role { Name = "تکنسین فوریتهای پزشکی", Category = "تکنسین", SortOrder = 6 },
- new Role { Name = "کارشناس آزمایشگاه", Category = "تکنسین", SortOrder = 7 });
+ // Roles are seeded by EnsureRolesAsync (idempotent, runs every startup).
foreach (var n in new[] { "سعادتآباد", "شهرک غرب", "ولیعصر / پارکوی", "نارمک",
"تهرانپارس", "گیشا / برج میلاد", "ونک", "تجریش" })
diff --git a/src/JobsMedical.Web/Program.cs b/src/JobsMedical.Web/Program.cs
index 586d0de..5367034 100644
--- a/src/JobsMedical.Web/Program.cs
+++ b/src/JobsMedical.Web/Program.cs
@@ -94,7 +94,8 @@ using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService();
db.Database.Migrate();
- await SeedData.SeedReferenceAsync(db); // cities/roles/districts always
+ await SeedData.SeedReferenceAsync(db); // cities/districts on first run
+ await SeedData.EnsureRolesAsync(db); // add any missing roles (idempotent, existing DBs too)
// Demo board in Development, or whenever the admin has turned Demo Mode on.
var st = await scope.ServiceProvider
.GetRequiredService().GetAsync();