۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

درک DbContext در Entity Framework Core

EF Core به شما این امکان را می دهد که یک DbContext را به روش های مختلفی نمونه سازی کنید. بیاموزید که چه زمانی و چگونه از این رویکردهای مختلف در برنامه های ASP.NET Core خود استفاده کنید.

EF Core به شما این امکان را می دهد که یک DbContext را به روش های مختلفی نمونه سازی کنید. بیاموزید که چه زمانی و چگونه از این رویکردهای مختلف در برنامه های ASP.NET Core خود استفاده کنید.

Entity Framework Core یک نقشه‌بردار شی رابطه‌ای یا ORM است که مدل شی برنامه شما را از مدل داده جدا می‌کند. این به شما امکان می دهد کدی بنویسید که عملیات CRUD را بدون نگرانی در مورد نحوه ذخیره داده ها انجام دهد. به عبارت دیگر، شما با استفاده از اشیاء آشنای دات نت با داده ها کار می کنید.

در Entity Framework Core، DbContext کلاس‌های دامنه را با عمل به عنوان پل بین آنها به پایگاه داده متصل می‌کند. می‌توانید از DbContext برای جستجوی داده‌ها در موجودیت‌های خود استفاده کنید یا موجودیت‌های خود را در پایگاه داده زیربنایی ذخیره کنید.

من اصول اولیه DbContext را در مقاله قبلی مورد بحث قرار داده‌ام. در این مقاله با کمی جزئیات بیشتر به DbContext می پردازیم، طول عمر DbContext را مورد بحث قرار می دهیم و بهترین روش ها را برای استفاده از DbContext در Entity Framework Core ارائه می دهیم. EF Core به شما این امکان را می دهد که یک DbContext را به روش های مختلفی نمونه سازی کنید. ما برخی از گزینه ها را بررسی می کنیم.

برای استفاده از نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا دانلود کنید.

یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید

برای ایجاد یک پروژه ASP.NET Core 8 Web API در Visual Studio 2022، مراحل ذکر شده در زیر را دنبال کنید.

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 8.0 (Long Term Support)» را به عنوان نسخه چارچوب انتخاب کنید و مطمئن شوید که تیک کادر «استفاده از کنترلرها» را بردارید. ما از حداقل API در این پروژه استفاده خواهیم کرد.
  9. در جای دیگری از پنجره «اطلاعات اضافی»، «نوع احراز هویت» را روی «هیچ‌کدام» (پیش‌فرض) بگذارید و مطمئن شوید که کادرهای «فعال کردن پشتیبانی از API باز کردن»، «پیکربندی برای HTTPS» و «فعال کردن داکر» را انتخاب کنید. کنترل نشده باقی بماند. ما در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
  10. روی ایجاد کلیک کنید.
خالق C++ هشدار کاخ سفید را رد کرد

ما از این پروژه ASP.NET Core Web API برای کار با DbContext در بخش‌های زیر استفاده خواهیم کرد.

DbContext چیست؟ چرا به آن نیاز است؟

هنگام کار با Entity Framework Core، DbContext یک جلسه اتصال با پایگاه داده را نشان می دهد. این به عنوان یک واحد کار عمل می کند و توسعه دهندگان را قادر می سازد تا تغییرات ایجاد شده در موجودیت ها را قبل از ذخیره آنها در پایگاه داده نظارت و کنترل کنند. ما از DbContext برای بازیابی داده‌های موجودیت‌های خود یا حفظ موجودیت‌هایمان در پایگاه داده استفاده می‌کنیم.

کلاس DbContext در EF Core به الگوهای Unit of Work و Repository پایبند است. این روشی را برای کپسوله کردن منطق پایگاه داده در برنامه ارائه می دهد، که کار با پایگاه داده و حفظ قابلیت استفاده مجدد کد و جداسازی نگرانی ها را آسان تر می کند.

DbContext در EF Core دارای تعدادی مسئولیت است:

  • مدیریت اتصالات
  • پرس و جو از داده ها از پایگاه داده
  • ذخیره داده ها در پایگاه داده
  • کنترل همزمان
  • تغییر ردیابی
  • در حال ذخیره
  • مدیریت تراکنش

طول عمر DbContext

کلاس DbContext در Entity Framework Core نقش مهمی در تسهیل ارتباط بین برنامه و پایگاه داده، ارائه پشتیبانی برای دسترسی به داده ها، ردیابی تغییرات و مدیریت تراکنش ایفا می کند. طول عمر یک نمونه DbContext زمانی شروع می‌شود که نمونه‌سازی می‌شود و زمانی که از بین می‌رود به پایان می‌رسد.

در اینجا توالی رویدادها در یک واحد کاری معمولی با استفاده از EF Core آمده است: 

  1. یک نمونه DbContext ایجاد شده است.
  2. نهادها با استفاده از این نمونه ردیابی می شوند.
  3. تغییرات در موجودیت های ردیابی شده ایجاد می شود.
  4. روش SaveChanges برای ذخیره موجودیت ها در حافظه در پایگاه داده زیربنایی فراخوانی می شود.
  5. شیء DbContext زمانی که دیگر مورد نیاز برنامه نباشد، دور ریخته یا جمع آوری می شود.

از استفاده از DbContext در استفاده از دستورات اجتناب کنید

یک نمونه DbContext زمانی باید حذف شود که دیگر برای آزاد کردن منابع مدیریت نشده و جلوگیری از نشت حافظه نیازی به آن نباشد. با این حال، حذف صریح نمونه‌های DbContext یا استفاده از DbContext در یک عبارت using توصیه نمی‌شود.

Deno 1.33 پایگاه داده داخلی با ارزش کلیدی را معرفی می کند

چرا نباید نمونه‌های DbContext خود را دور بیندازید:

  • وقتی یک شی DbContext را دور می اندازید، ممکن است یک یا چند موجودیت داشته باشید که نتوان آنها را در پایگاه داده ذخیره کرد.
  • نمونه سازی و انتشار اشیاء DbContext می تواند گران باشد، عمدتاً هنگام تنظیم یک اتصال پایگاه داده جدید.
  • حذف DbContext در داخل یک بلوک استفاده کننده پس از هر بار استفاده ممکن است منجر به سربار قابل اجتناب و کاهش عملکرد شود.
  • مصرف شیء DbContext هنگامی که تغییرات پایگاه داده در حال تعلیق هستند یا زمانی که هنوز انتظار دارید از زمینه استفاده کنید ممکن است منجر به مشکلات یا رفتار غیرمنتظره شود.
  • مصرف پیش از موعد نمونه‌های DbContext ممکن است با ردیابی تغییرات تداخل داشته باشد و به‌روزرسانی‌ها یا درخواست‌های بیشتر را دشوار یا غیرممکن کند.

به‌جای استفاده از بلوک‌های استفاده از برای از بین بردن نمونه‌های DbContext در برنامه‌تان، از مزایای تزریق وابستگی برای مدیریت طول عمر آنها استفاده کنید. با استفاده از تزریق وابستگی، بسته به چرخه عمر برنامه یا محدوده عملیات، DbContext به درستی ایجاد و دفع می شود.

یک نمونه DbContext جدید در EF Core ایجاد کنید

هیچ قانون خاصی برای ایجاد یک نمونه DbContext وجود ندارد. الزامات درخواست شما باید تعیین کند که کدام رویکرد را انتخاب می کنید. هر یک از رویکردهای نشان داده شده در زیر موارد استفاده خاص خود را دارد—هیچکدام از آنها بهتر از بقیه نیستند.

می‌توانید کلاس DbContext را در EF Core گسترش دهید تا کلاس DbContext خود را مطابق شکل زیر ایجاد کنید.

public class IDGDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

به طور مشابه، می توانید یک کلاس DbContextOptionsBuilder را نمونه سازی کنید و سپس از این نمونه برای ایجاد نمونه ای از DbContextOptions استفاده کنید. این نمونه DbContextOptions سپس می تواند به سازنده DbContext ارسال شود. این رویکرد به شما کمک می‌کند تا به طور واضح یک نمونه DbContext ایجاد کنید.

از تزریق وابستگی برای ایجاد نمونه های DbContext استفاده کنید

از طرف دیگر، می‌توانید نمونه‌های DbContext را از طریق تزریق وابستگی (DI) با پیکربندی نمونه DbContext خود با استفاده از روش AddDbContext مطابق شکل زیر ایجاد کنید.

services.AddDbContext<IDGDbContext>(
        options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));

سپس می توانید از تزریق سازنده در کنترلر خود برای بازیابی نمونه ای از DbContext مانند شکل زیر استفاده کنید.

public class IDGController
{
    private readonly IDGDbContext _dbContext;
    public IDGController(IDGDbContext dbContext)
    {
        _dbContext = dbContext;
    }
}

به طور معمول، یک چرخه درخواست-پاسخ HTTP واحدی از کار را در برنامه های کاربردی وب نشان می دهد. با DI، ما می توانیم برای هر درخواست یک نمونه DbContext ایجاد کنیم و زمانی که آن درخواست پایان یافت، آن را از بین ببریم.

مایکروسافت ابزارهای توسعه‌دهنده Edge را برای ویژوال استودیو پیش‌نمایش می‌کند

من ترجیح می‌دهم از یک ظرف DI برای نمونه‌سازی و پیکربندی DbContext استفاده کنم، زیرا ظرف DI موارد و طول عمر DbContext را برای شما مدیریت می‌کند و شما را از درد مدیریت صریح این نمونه‌ها رهایی می‌دهد.

DbContext را در روش OnConfiguring راه اندازی کنید

گزینه سوم ایجاد یک نمونه DbContext با نادیده گرفتن متد OnConfiguring در کلاس DbContext سفارشی شما است. سپس می توانید از سازنده DbContext برای انتقال اطلاعات پیکربندی، مانند رشته اتصال استفاده کنید.

قطعه کد زیر نشان می دهد که چگونه می توانید DbContext را در روش OnConfiguring کلاس DbContext سفارشی خود مقداردهی اولیه کنید.

public class IDGDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Specify your database connection string here.");
    }
}

برای ایجاد یک نمونه DbContext یک کارخانه ثبت کنید

همچنین می توانید نمونه ای از DbContext را با استفاده از کارخانه ایجاد کنید. زمانی که برنامه شما نیاز به انجام چندین واحد کار در یک محدوده خاص دارد، یک کارخانه مفید است.

در این مورد، می توانید از روش AddDbContextFactory برای ثبت کارخانه و ایجاد اشیاء DbContext خود همانطور که در قطعه کد زیر نشان داده شده است استفاده کنید.

services.AddDbContextFactory<IDGDbContext>(
        options =>
            options.UseSqlServer("Specify your database connection string here."));

سپس می توانید از تزریق سازنده در کنترلر خود برای ساختن نمونه های DbContext مانند شکل زیر استفاده کنید.

private readonly IDbContextFactory<IDGDbContext> _dbContextFactory;
public IDGController(IDbContextFactory<IDGDbContext> dbContextFactory)
{
    _dbContextFactory = dbContextFactory;
}

می‌توانید گزارش‌دهی داده‌های حساس را برای گنجاندن داده‌های برنامه زمانی که استثناها در برنامه شما ثبت می‌شوند، روشن کنید. قطعه کد زیر نشان می دهد که چگونه می توان این کار را انجام داد.

optionsBuilder
            .EnableSensitiveDataLogging()
            .UseSqlServer("Specify your database connection string here.");

در نهایت، توجه داشته باشید که چندین عملیات موازی را نمی توان به طور همزمان در یک نمونه DbContext اجرا کرد. این هم به اجرای موازی پرس و جوهای async و هم به هرگونه استفاده صریح از چندین رشته نمونه به طور همزمان اشاره دارد. بنابراین، توصیه می شود که عملیات موازی با استفاده از نمونه های جداگانه DbContext انجام شود. علاوه بر این، هرگز نباید نمونه‌های DbContext را بین رشته‌ها به اشتراک بگذارید، زیرا از نظر رشته ای امن نیست.

شاید به این مطالب علاقمند باشید