اعمال خودکار و امن مایگریشنهای EF Core با الگوی تلاش مجدد (Resilient Startup) (Resilient EF Core Database Migration Runner on App Startup)
در محیطهای سرور یا کانتینری (Docker)، ممکن است دیتابیس چند ثانیه پس از وباپلیکیشن در دسترس قرار گیرد. این الگو از کرش برنامه جلوگیری کرده و تا آماده شدن سرور دیتابیس تلاش مجدد میکند.
Guarantees resilient migration execution during app startup in microservice or containerized environments where the database engine takes a few seconds to warm up.
پیشنیازها و وابستگیها (Dependencies)
Microsoft.EntityFrameworkCore.SqlServer (>= 8.0), Microsoft.Extensions.Hosting// اجرای خودکار و مقاوم مایگریشنهای EF Core هنگام شروع برنامه
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
for (var attempt = 1; attempt <= 5; attempt++)
{
try
{
logger.LogInformation("در حال اعمال مایگریشنهای دیتابیس (تلاش {Attempt}/5)...", attempt);
db.Database.Migrate();
logger.LogInformation("دیتابیس با موفقیت بهروزرسانی شد.");
break;
}
catch (Exception ex) when (attempt < 5)
{
logger.LogWarning(ex, "ارتباط با سرور برقرار نشد؛ تلاش مجدد ۵ ثانیه دیگر...");
Thread.Sleep(TimeSpan.FromSeconds(5));
}
}
}
کد مکمل یا نمونه استفاده همراه (Companion / Setup Code)
مشاهده کد
// Program.cs - تنظیم DbContext با فعالسازی استراتژی Connection Resiliency
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection"),
sql => sql.EnableRetryOnFailure(
maxRetryCount: 5,
maxRetryDelay: TimeSpan.FromSeconds(10),
errorNumbersToAdd: null)));
نکات کلیدی و ترفندها (Tips & Notes)
دقت داشته باشید در صورت استفاده از ساختار Migrations در محیط پروداکشن، فراخوانی db.Database.EnsureCreated() توصیه نمیشود چون جدول __EFMigrationsHistory را مدیریت نمیکند.
پیشنیازها و کدهای پایه:
1 مورد
مراحل بعد و کدهای تکمیلی:
1 مورد