از قابلیت انعطاف پذیری اتصال در EF Core برای شناسایی خطاها و دستورات مجدد استفاده کنید و برنامه ASP.NET Core خود را برای غلبه بر خطاهای گذرا فعال کنید.
یک برنامه کاربردی با کیفیت بالا باید پایدار، کارآمد، مقیاس پذیر و قابل اعتماد باشد. قابلیت اطمینان یک برنامه به عوامل زیادی بستگی دارد، اما یکی از مهمترین آنها انعطاف پذیری یا توانایی مقاومت در برابر خرابی ها یا خطاها در طول زمان اجرا است. در این مقاله، خواهیم دید که چگونه می توانیم با استفاده از Entity Framework Core، انعطاف پذیری را به اتصالات پایگاه داده در ASP.NET Core بیاوریم.
EF Core یک ویژگی به نام انعطافپذیری اتصال دارد که بهطور خودکار دستورات ناموفق پایگاه داده را برای حفظ اتصال در هنگام خطاهای گذرا یا بیثباتی شبکه تکرار میکند. با کپسوله کردن منطق شناسایی خرابی ها و تلاش مجدد دستورات، این ویژگی به ما امکان می دهد برنامه های اجرایی برای موقعیت های مختلف خرابی پایگاه داده طراحی کنیم.
برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا دانلود کنید.
یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید
برای ایجاد یک پروژه ASP.NET Core Web API در Visual Studio 2022، مراحل ذکر شده در زیر را دنبال کنید.
- Visual Studio 2022 IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره «پیکربندی پروژه جدید»، نام و مکان پروژه جدید را مشخص کنید. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب “قرار دادن راه حل و پروژه در همان فهرست” را علامت بزنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی”، “NET 8.0 (Long Term Support)” را به عنوان نسخه چارچوب انتخاب کنید و مطمئن شوید که کادر “Use controllers” علامت زده شده است. ما در این پروژه از کنترلرها استفاده خواهیم کرد.
- در جای دیگری در پنجره «اطلاعات اضافی»، «نوع احراز هویت» را روی «هیچکدام» (پیشفرض) بگذارید و مطمئن شوید که کادرهای «فعال کردن پشتیبانی باز API»، «پیکربندی برای HTTPS» و «فعال کردن داکر» را انتخاب کنید. کنترل نشده باقی بماند. ما در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
ما از این پروژه ASP.NET Core Web API برای کار با نمونههای کد در بخشهای زیر استفاده خواهیم کرد.
یک استراتژی اجرا در EF Core ایجاد کنید
در EF Core، یک استراتژی اجرا به عنوان مؤلفهای تعریف میشود که منطق مدیریت خطاهای اجرای دستورات پایگاهداده را محصور میکند و اگر خطاها موقتی تلقی شوند، آنها را دوباره امتحان میکند. یک استراتژی اجرا به توسعه دهندگان این امکان را می دهد تا مطمئن شوند که برنامه های کاربردی آنها می توانند به خوبی از خطاهای گذرا و بدون نیاز به دخالت انسانی بازیابی شوند.
میتوانید با استفاده از متد CreateExecutionStrategy همانطور که در قطعه کد زیر نشان داده شده است، یک استراتژی اجرا ایجاد کنید.
var strategy = _context.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async () => { await using var transaction = await _context.Database.BeginTransactionAsync(); //Write your custom code here to perform CRUD operations //against the database await transaction.CommitAsync(); });
همانطور که از مثال کد زیر می بینید، یک استراتژی اجرا معمولاً در روش OnConfiguring کلاس DbContext سفارشی شما مشخص می شود.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .UseSqlServer( @"Server= mssqldb;Database=Test;Trusted_Connection=True", options => options.EnableRetryOnFailure()); }
اگر از پایگاه داده Azure SQL استفاده می کنید، EF Core از قبل منطق ارتجاعی و امتحان مجدد را برای پایگاه داده شما فراهم می کند. با این حال، اگر میخواهید از انعطافپذیری اتصال EF Core استفاده کنید، باید برای هر اتصال DbContext که برنامه شما ایجاد میکند، استراتژی اجرای EF Core را فعال کنید. قطعه کد زیر نشان میدهد که چگونه میتوانید اتصالات SQL انعطافپذیر را با استفاده از EF Core فعال کنید که هر زمان که اتصال پایگاه داده قطع شد، دوباره امتحان میشوند.
builder.Services.AddDbContext<LibraryContext>(options => { options.UseSqlServer(builder.Configuration["IDGConnectionString"], sqlServerOptionsAction: sqlOptions => { sqlOptions.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(45)); }); });
از انعطاف پذیری اتصال با تراکنش ها در EF Core استفاده کنید
اگر تلاشهای مجدد را در EF Core فعال کرده باشید، در صورت بروز مشکل در اتصال پایگاه داده، هر فراخوانی به روش SaveChanges بهعنوان یک واحد دوباره امتحان میشود. با این حال، اگر یک بلوک تراکنش را در کد برنامه خود اجرا کنید، با استفاده از روش BeginTransaction، باید یک استراتژی اجرایی را به صراحت با استفاده از یک نماینده فراخوانی کنید تا اطمینان حاصل کنید که هر عملیات در داخل تراکنش اجرا شده است. این در قطعه کد زیر نشان داده شده است.
var strategy = db.Database.CreateExecutionStrategy(); strategy.Execute( () => { using var context = new LibraryContext(); using var transaction = context.Database.BeginTransaction(); context.Books.Add(new Book { Id = 1, Title = "Let us C" }); context.SaveChanges(); context.Books.Add(new Book { Id = 2, Title = "Mastering C# 8.0" }); context.SaveChanges(); transaction.Commit(); });
نقص اتصال پایگاه داده را در ASP.NET Core مدیریت کنید
هنگام کار با اتصالات پایگاه داده با استفاده از EF Core، باید با گرفتن استثناها و امتحان مجدد عملیات پایگاه داده، با شکست اتصالات احتمالی مقابله کنید. کلاس موجودیت زیر به نام مشتری را در نظر بگیرید.
public class Customer { public int Id { get; set; } public string FirstName { get; set; } = string.Empty; public string LastName { get; set; } = string.Empty; public string Address { get; set; } = string.Empty; public string City { get; set; } = string.Empty; public string PostalCode { get; set; } = string.Empty; public string Country { get; set; } = string.Empty; public string Phone { get; set; } = string.Empty; }
لیست کد زیر کلاس DbConnectService را نشان میدهد که رابط IDbConnectService را پیادهسازی میکند و نشان میدهد که چگونه خرابیهای اتصال و عملیات امتحان مجدد میتوانند پیادهسازی شوند.
public class DbConnectService : IDbConnectService { private readonly CustomDbContext _dbContext; public DbConnectService(CustomDbContext dbContext) { _dbContext = dbContext; } public async Task<Customer> GetCustomer(int customerId) { try { return await _dbContext.Customers.FindAsync(customerId); } catch (SqlException ex) { //Write your custom code here to handle // connection failure and retry the operation // or implement a fallback strategy } return await Task.FromResult<Customer>(null); } }
کد منبع رابط IDbConnectService در زیر آورده شده است.
public interface IDbConnectService { public Task<Customer> GetCustomer(int customerId); }
یک کلاس DbContext سفارشی در EF Core ایجاد کنید
همانطور که در بالا ذکر شد، معمولاً استراتژی اجرای خود را در روش OnConfiguring کلاس DbContext سفارشی خود مشخص می کنید. لیست کد زیر کلاس CustomDbContext را نشان می دهد که کلاس DbContext از EF Core را گسترش می دهد و روش های OnConfiguring و OnModelCreating را پیاده سازی می کند.
public class CustomContext : DbContext { public DbSet<Customer> Customers { get; set; } public CustomContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .UseSqlServer( @"Server= mssqldb;Database=Test;Trusted_Connection=True", options => options.EnableRetryOnFailure()); } protected override void OnModelCreating(ModelBuilder modelBuilder) { //Write your custom code here to //configure the models used in your application } }
یک راه عالی برای مدیریت خرابیهای اتصال پایگاه داده و انعطافپذیر کردن برنامهتان، استفاده از Polly است، یک کتابخانه رسیدگی به خطا برای دات نت. میتوانید از Polly برای پیادهسازی عملکرد قطعکننده مدار استفاده کنید تا هرگونه خرابی اتصال پایگاه داده در برنامه بهخوبی مدیریت شود. در پست آینده در اینجا درباره استفاده از Polly برای پیاده سازی مدارشکن صحبت خواهم کرد.
پست های مرتبط
نحوه پیاده سازی انعطاف پذیری اتصال پایگاه داده در ASP.NET Core
نحوه پیاده سازی انعطاف پذیری اتصال پایگاه داده در ASP.NET Core
نحوه پیاده سازی انعطاف پذیری اتصال پایگاه داده در ASP.NET Core