مخزن جامع کدها و الگوهای توسعه

اسنیپت‌ها، ترفندها و کدهای کاربردی

مجموعه‌ای منتخب از ساختارهای کد، پیکربندی‌های بهینه، پیش‌نیازها و کدهای همراه برای زبان‌ها و فریم‌ورک‌های مختلف.

۱ کد انتخاب شده
دسته‌بندی: مایگریشن‌ها و پیکربندی دیتابیس اعمال خودکار و امن مایگریشن‌های EF Core با الگوی تلاش مجدد (Resilient Startup)
پاکسازی همه فیلترها
مایگریشن‌ها و پیکربندی دیتابیس CSHARP 1405/06/30

اعمال خودکار و امن مایگریشن‌های 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
csharp
// اجرای خودکار و مقاوم مایگریشن‌های 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)
مشاهده کد
csharp
// 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 را مدیریت نمی‌کند.