کالبدشکافی خطاهای مهلک در مایگریشنهای EF Core: راهنمای جامع بقا در محیط پروداکشن
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۶/۰۴ ۰۹:۵۰
آدرس: www.dntips.ir
چکیده: ابزار مایگریشن در Entity Framework Core (EF Core) یکی از قدرتمندترین راهکارهای مدیریت شمای پایگاه داده به صورت کد (Code-First) در اکوسیستم داتنت است. با این حال، استفاده ناآگاهانه و اتکای صرف به خروجیهای خودکار آن میتواند به از دست رفتن دادهها (Data Loss)، قفلهای طولانیمدت جداول (Table Locks) و توقف سرویس در محیطهای عملیاتی بینجامد. این مقاله به تحلیل ۵ خطای رایج اما ویرانگر در اعمال مایگریشنها پرداخته، ریشههای فنی آنها را بررسی میکند و الگوهای معماری مطمئن برای استقرار پایگاه داده در خطوط لوله CI/CD ارائه میدهد.
ModelSnapshot) میسنجد. EF Core تغییر نام را تشخیص نمیدهد، بلکه آن را به صورت «حذف ستون قبلی» و «افزودن ستون جدید» تفسیر میکند.// مدل اولیه
public string DiscountCode { get; set; }
// مدل بعد از تغییر نام
public string CouponId { get; set; }migrationBuilder.DropColumn(name: "DiscountCode", table: "Orders"); migrationBuilder.AddColumn<string>(name: "CouponId", table: "Orders");
DiscountCode را بیصدا حذف میکند.RenameColumn تبدیل کنید:migrationBuilder.RenameColumn(
name: "DiscountCode",
table: "Orders",
newName: "CouponId");NOT NULL تعریف میکند. در یک جدول عملیاتی دارای رکورد، موتور پایگاه داده امکان ذخیره NULL برای سطرهای پیشین را ندارد و عملیات با خطای SqlException متوقف میشود.migrationBuilder.AddColumn<string>(
name: "Category",
table: "Products",
type: "nvarchar(max)",
nullable: false,
defaultValue: "Uncategorized");Nullable اضافه کنید (Deploy v1).NOT NULL تغییر دهید (Deploy v2).db.Database.Migrate()در زمان راهاندازی برنامه (App Startup)Program.cs در برنامههای تحت بار یا کلاسترهای ابری (مانند Kubernetes) خطرات شدیدی به همراه دارد:__EFMigrationsHistory میتواند وضعیت مایگریشن را ناهمخوان کند.# ایجاد اسکریپت خام SQL به صورت Idempotent (بهترین روش در محیطهای Enterprise) dotnet ef migrations script --idempotent --output migrate.sql --project src/MyApp # یا استفاده از Migration Bundles (یک فایل باینری مستقل و سبک) dotnet ef migrations bundle --output efbundle ./efbundle --connection "Server=...;Database=..."
ONLINE = ON در اسکریپت تولید ایندکس.CREATE INDEX CONCURRENTLY.Down()Down() تنها ساختار فیزیکی اسکیمای معکوس را تولید میکند و قادر به بازگرداندن دادههای از دست رفته نیست (برای مثال داده ستونی که حذف شده است).| روش اجرا | مزایا | معایب | محیط مناسب |
db.Database.Migrate() در Startup | پیادهسازی ساده و سریع | ریسک بالا در کلاسترها، ایجاد Race Condition | فقط Development |
dotnet ef database update در CI/CD | مستقل از چرخه حیات کانتینر | نیاز به دسترسی شبکه مستقیم Pipeline به DB | Staging و پروداکشنهای کوچک |
Migration Bundles (efbundle) | پرتابل، بدون نیاز به نصب SDK در سرور | نیاز به ساخت و نگهداری آرتیفکت در پایپلاین | Cloud Native / Kubernetes |
| Idempotent SQL Script | شفافیت کامل، قابلیت بازبینی توسط DBA | نیازمند یک مرحله اعمال اسکریپت دستی/خودکار | Enterprise Production |
DropColumn یا DropTable در فایل وجود ندارد؟NOT NULL، مقدار پیشفرض یا استراتژی دو مرحلهای لحاظ شده است؟