feat: add DataSeeder for reference/test data and auto-migration on startup

This commit is contained in:
2026-06-09 01:31:37 +03:30
parent f101085b52
commit 8be6133661
2 changed files with 526 additions and 0 deletions

View File

@@ -0,0 +1,510 @@
using Complex.Domain.Entities;
using Microsoft.EntityFrameworkCore;
namespace Complex.Infrastructure
{
public static class DataSeeder
{
public static async Task SeedAsync(ComplexDBContext context)
{
// Only seed if the database is empty (no provinces means fresh database)
if (await context.Set<Province>().AnyAsync())
return;
// ============================================================
// 1. PROVINCES & CITIES (Reference Data)
// ============================================================
var provinces = GetProvinces();
context.Set<Province>().AddRange(provinces);
await context.SaveChangesAsync();
// ============================================================
// 2. TRANSACTION TYPES (Reference Data)
// ============================================================
var transactionTypes = new List<TransactionType>
{
new() { Id = 1, Title = "درآمد" }, // Income
new() { Id = 2, Title = "مخارج" }, // Expense
};
context.Set<TransactionType>().AddRange(transactionTypes);
await context.SaveChangesAsync();
// ============================================================
// 3. INCOME/COST TITLES (Reference Data)
// ============================================================
var incomeCostTitles = new List<IncomeCostTitle>
{
new() { Id = 1, Title = "شارژ ماهیانه", TransactionTypeId = 1 },
new() { Id = 2, Title = "هزینه آب", TransactionTypeId = 2 },
new() { Id = 3, Title = "هزینه برق", TransactionTypeId = 2 },
new() { Id = 4, Title = "هزینه گاز", TransactionTypeId = 2 },
new() { Id = 5, Title = "هزینه نظافت", TransactionTypeId = 2 },
new() { Id = 6, Title = "هزینه تعمیرات", TransactionTypeId = 2 },
new() { Id = 7, Title = "هزینه آسانسور", TransactionTypeId = 2 },
new() { Id = 8, Title = "پارکینگ", TransactionTypeId = 1 },
new() { Id = 9, Title = "جریمه", TransactionTypeId = 1 },
new() { Id = 10, Title = "هزینه اینترنت", TransactionTypeId = 2 },
new() { Id = 11, Title = "هزینه نگهبانی", TransactionTypeId = 2 },
new() { Id = 12, Title = "هزینه باغبانی", TransactionTypeId = 2 },
};
context.Set<IncomeCostTitle>().AddRange(incomeCostTitles);
await context.SaveChangesAsync();
// ============================================================
// 4. UNIT STATES (Reference Data)
// ============================================================
var unitStates = new List<UnitState>
{
new() { Id = 1, Title = "ساکن دارد", Icon = "home" },
new() { Id = 2, Title = "خالی", Icon = "door-open" },
new() { Id = 3, Title = "بازسازی", Icon = "hammer" },
new() { Id = 4, Title = "اجاره داده شده", Icon = "key" },
new() { Id = 5, Title = "فروخته شده", Icon = "handshake" },
};
context.Set<UnitState>().AddRange(unitStates);
await context.SaveChangesAsync();
// ============================================================
// 5. PERSONS (Test Data)
// ============================================================
var persons = new List<Person>
{
new() { Id = "09120000001", FirstName = "علی", LastName = "مدیر", Gender = 1, IsActive = true },
new() { Id = "09120000002", FirstName = "رضا", LastName = "ساکن", Gender = 1, IsActive = true },
new() { Id = "09120000003", FirstName = "مریم", LastName = "ساکنی", Gender = 2, IsActive = true },
new() { Id = "09120000004", FirstName = "مدیر", LastName = "سیستم", Gender = 1, IsActive = true },
new() { Id = "09120000005", FirstName = "احمد", LastName = "احمدی", Gender = 1, IsActive = true },
new() { Id = "09120000006", FirstName = "سارا", LastName = "محمدی", Gender = 2, IsActive = true },
new() { Id = "09120000007", FirstName = "حسین", LastName = "حسینی", Gender = 1, IsActive = true },
new() { Id = "09120000008", FirstName = "زهرا", LastName = "رضایی", Gender = 2, IsActive = true },
new() { Id = "09120000009", FirstName = "محمد", LastName = "محمدیان", Gender = 1, IsActive = true },
new() { Id = "09120000010", FirstName = "فاطمه", LastName = "کریمی", Gender = 2, IsActive = true },
new() { Id = "09120000011", FirstName = "امیر", LastName = "امیری", Gender = 1, IsActive = true },
new() { Id = "09120000012", FirstName = "نرگس", LastName = "نرگسی", Gender = 2, IsActive = true },
};
context.Set<Person>().AddRange(persons);
await context.SaveChangesAsync();
// ============================================================
// 6. COMPLEX ENTITIES (Test Data)
// ============================================================
var complexId1 = Guid.Parse("A1B2C3D4-E5F6-7890-ABCD-EF1234567890");
var complexId2 = Guid.Parse("B2C3D4E5-F6A7-8901-BCDE-F12345678901");
var complexes = new List<ComplexEntity>
{
new()
{
Id = complexId1,
Title = "مجتمع بهاران",
Address = "تهران، خیابان ولیعصر، نبش کوچه بهار",
CityId = 1, // Tehran
AreaMeter = 2000,
YardMeter = 500,
ElevatorCount = 2,
WarehouseCount = 10,
YearMake = 1398,
Description = "مجتمع مسکونی 10 واحده با امکانات کامل"
},
new()
{
Id = complexId2,
Title = "مجتمع ساحل",
Address = "اصفهان، خیابان چهارباغ، روبروی پارک ساحل",
CityId = 3, // Isfahan
AreaMeter = 1500,
YardMeter = 300,
ElevatorCount = 1,
WarehouseCount = 6,
YearMake = 1400,
Description = "مجتمع مسکونی 6 واحده"
},
};
context.Set<ComplexEntity>().AddRange(complexes);
await context.SaveChangesAsync();
// ============================================================
// 7. COMPLEX MANAGERS (Test Data)
// ============================================================
var complexManagers = new List<ComplexManager>
{
new()
{
ComplexId = complexId1,
ManagerMobileNumberId = "09120000001", // علی مدیر
StartDate = "1402/01/01",
EndDate = "1405/12/29"
},
new()
{
ComplexId = complexId2,
ManagerMobileNumberId = "09120000004", // مدیر سیستم
StartDate = "1402/06/01",
EndDate = "1405/06/01"
},
};
context.Set<ComplexManager>().AddRange(complexManagers);
await context.SaveChangesAsync();
// ============================================================
// 8. COMPLEX PERSONS (Test Data)
// ============================================================
var complexPersons = new List<ComplexPerson>
{
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000001" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000002" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000003" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000005" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000006" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000007" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000008" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000009" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000010" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000011" },
new() { ComplexId = complexId1, PersonMobileNumberId = "09120000012" },
new() { ComplexId = complexId2, PersonMobileNumberId = "09120000004" },
new() { ComplexId = complexId2, PersonMobileNumberId = "09120000005" },
new() { ComplexId = complexId2, PersonMobileNumberId = "09120000006" },
new() { ComplexId = complexId2, PersonMobileNumberId = "09120000007" },
};
context.Set<ComplexPerson>().AddRange(complexPersons);
await context.SaveChangesAsync();
// ============================================================
// 9. UNITS (Test Data)
// ============================================================
var unitIds = new List<Guid>
{
Guid.Parse("11111111-1111-1111-1111-111111111101"),
Guid.Parse("11111111-1111-1111-1111-111111111102"),
Guid.Parse("11111111-1111-1111-1111-111111111103"),
Guid.Parse("11111111-1111-1111-1111-111111111104"),
Guid.Parse("11111111-1111-1111-1111-111111111105"),
Guid.Parse("11111111-1111-1111-1111-111111111106"),
Guid.Parse("11111111-1111-1111-1111-111111111107"),
Guid.Parse("11111111-1111-1111-1111-111111111108"),
Guid.Parse("11111111-1111-1111-1111-111111111109"),
Guid.Parse("11111111-1111-1111-1111-111111111110"),
Guid.Parse("22222222-2222-2222-2222-222222222201"),
Guid.Parse("22222222-2222-2222-2222-222222222202"),
Guid.Parse("22222222-2222-2222-2222-222222222203"),
Guid.Parse("22222222-2222-2222-2222-222222222204"),
Guid.Parse("22222222-2222-2222-2222-222222222205"),
Guid.Parse("22222222-2222-2222-2222-222222222206"),
};
var units = new List<Unit>
{
// Complex 1 - 10 units
new() { Id = unitIds[0], ComplexId = complexId1, UnitName = "واحد 1", OwnerId = "09120000002", TenantId = null, IsActive = true, AreaMeter = 120, Floor = 1, StateId = 1, EmergencyTels = "09120000002" },
new() { Id = unitIds[1], ComplexId = complexId1, UnitName = "واحد 2", OwnerId = "09120000003", TenantId = null, IsActive = true, AreaMeter = 100, Floor = 1, StateId = 1, EmergencyTels = "09120000003" },
new() { Id = unitIds[2], ComplexId = complexId1, UnitName = "واحد 3", OwnerId = "09120000005", TenantId = "09120000006", IsActive = true, AreaMeter = 110, Floor = 2, StateId = 4, EmergencyTels = "09120000005,09120000006" },
new() { Id = unitIds[3], ComplexId = complexId1, UnitName = "واحد 4", OwnerId = "09120000007", TenantId = null, IsActive = true, AreaMeter = 130, Floor = 2, StateId = 1, EmergencyTels = "09120000007" },
new() { Id = unitIds[4], ComplexId = complexId1, UnitName = "واحد 5", OwnerId = null, TenantId = null, IsActive = true, AreaMeter = 90, Floor = 3, StateId = 2, EmergencyTels = "" },
new() { Id = unitIds[5], ComplexId = complexId1, UnitName = "واحد 6", OwnerId = "09120000008", TenantId = null, IsActive = true, AreaMeter = 140, Floor = 3, StateId = 1, EmergencyTels = "09120000008" },
new() { Id = unitIds[6], ComplexId = complexId1, UnitName = "واحد 7", OwnerId = "09120000009", TenantId = "09120000010", IsActive = true, AreaMeter = 95, Floor = 4, StateId = 4, EmergencyTels = "09120000009,09120000010" },
new() { Id = unitIds[7], ComplexId = complexId1, UnitName = "واحد 8", OwnerId = "09120000011", TenantId = null, IsActive = true, AreaMeter = 115, Floor = 4, StateId = 1, EmergencyTels = "09120000011" },
new() { Id = unitIds[8], ComplexId = complexId1, UnitName = "واحد 9", OwnerId = "09120000012", TenantId = null, IsActive = true, AreaMeter = 105, Floor = 5, StateId = 1, EmergencyTels = "09120000012" },
new() { Id = unitIds[9], ComplexId = complexId1, UnitName = "واحد 10", OwnerId = null, TenantId = null, IsActive = false,AreaMeter = 80, Floor = 5, StateId = 3, EmergencyTels = "" },
// Complex 2 - 6 units
new() { Id = unitIds[10], ComplexId = complexId2, UnitName = "واحد 1", OwnerId = "09120000005", TenantId = null, IsActive = true, AreaMeter = 110, Floor = 1, StateId = 1, EmergencyTels = "09120000005" },
new() { Id = unitIds[11], ComplexId = complexId2, UnitName = "واحد 2", OwnerId = "09120000006", TenantId = null, IsActive = true, AreaMeter = 90, Floor = 1, StateId = 1, EmergencyTels = "09120000006" },
new() { Id = unitIds[12], ComplexId = complexId2, UnitName = "واحد 3", OwnerId = "09120000007", TenantId = null, IsActive = true, AreaMeter = 120, Floor = 2, StateId = 1, EmergencyTels = "09120000007" },
new() { Id = unitIds[13], ComplexId = complexId2, UnitName = "واحد 4", OwnerId = null, TenantId = null, IsActive = true, AreaMeter = 85, Floor = 2, StateId = 2, EmergencyTels = "" },
new() { Id = unitIds[14], ComplexId = complexId2, UnitName = "واحد 5", OwnerId = "09120000004", TenantId = null, IsActive = true, AreaMeter = 100, Floor = 3, StateId = 1, EmergencyTels = "09120000004" },
new() { Id = unitIds[15], ComplexId = complexId2, UnitName = "واحد 6", OwnerId = null, TenantId = null, IsActive = false,AreaMeter = 95, Floor = 3, StateId = 3, EmergencyTels = "" },
};
context.Set<Unit>().AddRange(units);
await context.SaveChangesAsync();
// ============================================================
// 10. COST CYCLES (Test Data)
// ============================================================
var costCycleId1 = Guid.Parse("CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCC01");
var costCycleId2 = Guid.Parse("CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCC02");
var costCycles = new List<CostCycle>
{
new()
{
Id = costCycleId1,
ComplexId = complexId1,
Title = "شارژ فروردین 1404",
StartDate = new DateOnly(1404, 1, 1),
EndDate = new DateOnly(1404, 1, 31),
Amount = 500000,
EncouragementDay = 10,
EncouragementAmount = 450000,
IncomeCostTitleId = null, // شارژ ماهیانه
},
new()
{
Id = costCycleId2,
ComplexId = complexId1,
Title = "هزینه نظافت فروردین 1404",
StartDate = new DateOnly(1404, 1, 1),
EndDate = new DateOnly(1404, 1, 31),
Amount = 200000,
EncouragementDay = 0,
EncouragementAmount = 0,
IncomeCostTitleId = 5, // هزینه نظافت
},
};
context.Set<CostCycle>().AddRange(costCycles);
await context.SaveChangesAsync();
// Associate CostCycles with Units (many-to-many via CostCycleUnit)
// For costCycle1 - all units of complex1
var complex1Units = units.Take(10).ToList();
foreach (var unit in complex1Units)
{
// We need to add to the join table manually via the navigation property
var cycle1 = await context.Set<CostCycle>().Include(c => c.Units).FirstAsync(c => c.Id == costCycleId1);
cycle1.Units.Add(unit);
}
// For costCycle2 - only units 1,2,3,4 of complex1
var selectedUnits = units.Take(4).ToList();
var cycle2 = await context.Set<CostCycle>().Include(c => c.Units).FirstAsync(c => c.Id == costCycleId2);
foreach (var unit in selectedUnits)
{
cycle2.Units.Add(unit);
}
await context.SaveChangesAsync();
// ============================================================
// 11. UNIT COSTS (Test Data)
// ============================================================
var unitCosts = new List<UnitCost>();
long unitCostId = 1;
foreach (var unit in complex1Units)
{
unitCosts.Add(new UnitCost
{
Id = unitCostId++,
CostCycleId = costCycleId1,
UnitId = unit.Id,
Date = new DateOnly(1404, 1, 1),
TransactionId = null
});
}
foreach (var unit in selectedUnits)
{
unitCosts.Add(new UnitCost
{
Id = unitCostId++,
CostCycleId = costCycleId2,
UnitId = unit.Id,
Date = new DateOnly(1404, 1, 1),
TransactionId = null
});
}
context.Set<UnitCost>().AddRange(unitCosts);
await context.SaveChangesAsync();
// ============================================================
// 12. TRANSACTIONS (Test Data - some paid, some unpaid)
// ============================================================
var transactions = new List<Transaction>
{
new()
{
Id = 1,
TransactionTitleId = null, // شارژ
TransactionPersianDate = "1404/01/15",
TransactionDate = new DateTime(2025, 4, 4),
Amount = 500000,
Description = "پرداخت شارژ فروردین - واحد 1",
CostCycleId = costCycleId1,
UnitId = unitIds[0],
UnitCostId = 1, // First UnitCost
ComplexId = complexId1,
PersonId = "09120000002",
FicheId = "FICHE-001"
},
new()
{
Id = 2,
TransactionTitleId = null,
TransactionPersianDate = "1404/01/20",
TransactionDate = new DateTime(2025, 4, 9),
Amount = 500000,
Description = "پرداخت شارژ فروردین - واحد 2",
CostCycleId = costCycleId1,
UnitId = unitIds[1],
UnitCostId = 2,
ComplexId = complexId1,
PersonId = "09120000003",
FicheId = "FICHE-002"
},
new()
{
Id = 3,
TransactionTitleId = 5, // هزینه نظافت
TransactionPersianDate = "1404/01/25",
TransactionDate = new DateTime(2025, 4, 14),
Amount = 200000,
Description = "پرداخت هزینه نظافت - واحد 1",
CostCycleId = costCycleId2,
UnitId = unitIds[0],
UnitCostId = 11,
ComplexId = complexId1,
PersonId = "09120000002",
FicheId = "FICHE-003"
},
};
context.Set<Transaction>().AddRange(transactions);
await context.SaveChangesAsync();
// Update UnitCosts to mark them as paid (link TransactionId)
var paidUnitCost1 = await context.Set<UnitCost>().FindAsync(1L);
if (paidUnitCost1 != null) paidUnitCost1.TransactionId = 1;
var paidUnitCost2 = await context.Set<UnitCost>().FindAsync(2L);
if (paidUnitCost2 != null) paidUnitCost2.TransactionId = 2;
var paidUnitCost11 = await context.Set<UnitCost>().FindAsync(11L);
if (paidUnitCost11 != null) paidUnitCost11.TransactionId = 3;
await context.SaveChangesAsync();
// ============================================================
// 13. CHATS (Test Data)
// ============================================================
var chats = new List<Chat>
{
new()
{
ComplexId = complexId1,
PersonMobileNumber = "09120000002",
Body = "سلام. وقت بخیر. لطفاً در مورد شارژ ماه جاری راهنمایی بفرمایید.",
ChatTypeId = 1
},
new()
{
ComplexId = complexId1,
PersonMobileNumber = "09120000001",
Body = "سلام. شارژ فروردین ۵۰۰ هزار تومان است. مهلت پرداخت تا ۱۰ فروردین با تخفیف می‌باشد.",
ChatTypeId = 2
},
new()
{
ComplexId = complexId1,
PersonMobileNumber = "09120000005",
Body = "آسانسور طبقه ۳ مشکل دارد. لطفاً رسیدگی کنید.",
ChatTypeId = 1
},
};
context.Set<Chat>().AddRange(chats);
await context.SaveChangesAsync();
// ============================================================
// 14. COMPLEX UNIT EVENTS (Test Data)
// ============================================================
var events = new List<ComplexUnitEvent>
{
new()
{
UnitId = unitIds[0],
EventDate = "1404/01/05",
RegisterMobileNumber = "09120000002",
Body = "تعویض کنتور آب",
Description = "کنتور آب واحد ۱ تعویض شد"
},
new()
{
UnitId = unitIds[2],
EventDate = "1404/01/10",
RegisterMobileNumber = "09120000005",
Body = "تعمیر شیرآلات",
Description = "شیرآلات آشپزخانه تعمیر شد"
},
new()
{
ComplexId = null,
UnitId = null,
EventDate = "1404/01/01",
RegisterMobileNumber = "09120000001",
Body = "سال نو مبارک",
Description = "تبریک سال نو به تمام ساکنین مجتمع"
},
};
context.Set<ComplexUnitEvent>().AddRange(events);
await context.SaveChangesAsync();
// ============================================================
// 15. POSTERS (Test Data)
// ============================================================
var posters = new List<Poster>
{
new()
{
RegisterMobileNumber = "09120000001",
IsActive = true,
ImagePath = "/images/posters/banner1.jpg"
},
new()
{
RegisterMobileNumber = "09120000001",
IsActive = false,
ImagePath = "/images/posters/banner2.jpg"
},
};
context.Set<Poster>().AddRange(posters);
await context.SaveChangesAsync();
}
private static List<Province> GetProvinces()
{
return new List<Province>
{
new() { ProvinceId = 1, ProvinceTitle = "آذربایجان شرقی", Cities = GetCities(1, "تبریز", "مراغه", "مرند", "میانه") },
new() { ProvinceId = 2, ProvinceTitle = "آذربایجان غربی", Cities = GetCities(2, "ارومیه", "خوی", "میاندوآب", "سلماس") },
new() { ProvinceId = 3, ProvinceTitle = "اردبیل", Cities = GetCities(3, "اردبیل", "پارس‌آباد", "مشگین‌شهر") },
new() { ProvinceId = 4, ProvinceTitle = "اصفهان", Cities = GetCities(4, "اصفهان", "کاشان", "خمینی‌شهر", "نجف‌آباد", "شهرضا") },
new() { ProvinceId = 5, ProvinceTitle = "البرز", Cities = GetCities(5, "کرج", "فردیس", "هشتگرد") },
new() { ProvinceId = 6, ProvinceTitle = "ایلام", Cities = GetCities(6, "ایلام", "دهلران") },
new() { ProvinceId = 7, ProvinceTitle = "بوشهر", Cities = GetCities(7, "بوشهر", "برازجان", "کنگان") },
new() { ProvinceId = 8, ProvinceTitle = "تهران", Cities = GetCities(8, "تهران", "شهریار", "اسلامشهر", "رباط‌کریم", "ورامین") },
new() { ProvinceId = 9, ProvinceTitle = "چهارمحال و بختیاری", Cities = GetCities(9, "شهرکرد", "بروجن") },
new() { ProvinceId = 10, ProvinceTitle = "خراسان جنوبی", Cities = GetCities(10, "بیرجند", "قائن") },
new() { ProvinceId = 11, ProvinceTitle = "خراسان رضوی", Cities = GetCities(11, "مشهد", "نیشابور", "سبزوار", "گناباد", "تربت‌حیدریه") },
new() { ProvinceId = 12, ProvinceTitle = "خراسان شمالی", Cities = GetCities(12, "بجنورد", "شیروان") },
new() { ProvinceId = 13, ProvinceTitle = "خوزستان", Cities = GetCities(13, "اهواز", "آبادان", "خرمشهر", "دزفول", "بندر ماهشهر") },
new() { ProvinceId = 14, ProvinceTitle = "زنجان", Cities = GetCities(14, "زنجان", "ابهر") },
new() { ProvinceId = 15, ProvinceTitle = "سمنان", Cities = GetCities(15, "سمنان", "شاهرود", "دامغان") },
new() { ProvinceId = 16, ProvinceTitle = "سیستان و بلوچستان", Cities = GetCities(16, "زاهدان", "زابل", "چابهار", "ایرانشهر") },
new() { ProvinceId = 17, ProvinceTitle = "فارس", Cities = GetCities(17, "شیراز", "مرودشت", "جهرم", "فسا", "کازرون") },
new() { ProvinceId = 18, ProvinceTitle = "قزوین", Cities = GetCities(18, "قزوین", "الوند", "تاکستان") },
new() { ProvinceId = 19, ProvinceTitle = "قم", Cities = GetCities(19, "قم") },
new() { ProvinceId = 20, ProvinceTitle = "کردستان", Cities = GetCities(20, "سنندج", "سقز", "مریوان") },
new() { ProvinceId = 21, ProvinceTitle = "کرمان", Cities = GetCities(21, "کرمان", "رفسنجان", "سیرجان", "زرند") },
new() { ProvinceId = 22, ProvinceTitle = "کرمانشاه", Cities = GetCities(22, "کرمانشاه", "اسلام‌آباد غرب", "کنگاور") },
new() { ProvinceId = 23, ProvinceTitle = "کهگیلویه و بویراحمد", Cities = GetCities(23, "یاسوج", "گچساران") },
new() { ProvinceId = 24, ProvinceTitle = "گلستان", Cities = GetCities(24, "گرگان", "گنبد کاووس", "علی‌آباد") },
new() { ProvinceId = 25, ProvinceTitle = "گیلان", Cities = GetCities(25, "رشت", "انزلی", "لاهیجان", "لنگرود") },
new() { ProvinceId = 26, ProvinceTitle = "لرستان", Cities = GetCities(26, "خرم‌آباد", "بروجرد", "الیگودرز") },
new() { ProvinceId = 27, ProvinceTitle = "مازندران", Cities = GetCities(27, "ساری", "بابل", "آمل", "قائم‌شهر", "چالوس") },
new() { ProvinceId = 28, ProvinceTitle = "مرکزی", Cities = GetCities(28, "اراک", "ساوه", "خمین") },
new() { ProvinceId = 29, ProvinceTitle = "هرمزگان", Cities = GetCities(29, "بندرعباس", "قشم", "کیش", "بندر لنگه") },
new() { ProvinceId = 30, ProvinceTitle = "همدان", Cities = GetCities(30, "همدان", "ملایر", "نهاوند") },
new() { ProvinceId = 31, ProvinceTitle = "یزد", Cities = GetCities(31, "یزد", "میبد", "اردکان") },
};
}
private static List<City> GetCities(int provinceId, params string[] cityNames)
{
var cities = new List<City>();
int cityId = provinceId * 100; // Simple ID generation: provinceId * 100 + index
for (int i = 0; i < cityNames.Length; i++)
{
cities.Add(new City
{
CityId = cityId + i + 1,
ProvinceId = provinceId,
CityTitle = cityNames[i]
});
}
return cities;
}
}
}