بیاموزید که چگونه میتوانید تغییرات موجودیتها را در حالی که از زمینه EF در Entity Framework Core جدا هستید، ردیابی کنید.
Entity Framework یک نقشهبردار منبع باز، شی رابطهای (ORM) است که دسترسی به دادهها را در برنامه شما ساده میکند. این شما را قادر می سازد تا کدی را برای انجام عملیات CRUD (ایجاد، خواندن، به روز رسانی و حذف) بدون نیاز به دانستن نحوه نگهداری داده ها در پایگاه داده زیربنایی انجام دهید. Entity Framework Core نسخه Entity Framework است که روی NET Core اجرا می شود.
Entity Framework Core روشهایی را برای بازیابی موجودیتها از ذخیرهگاه داده، افزودن، تغییر یا حذف موجودیتها و عبور از نمودارهای موجودیت ارائه میدهد. در حالی که این تکنیک ها در شرایط متصل به خوبی عمل می کنند، ممکن است اغلب بخواهید در حالت قطع شده کار کنید و همچنان گراف شیء کامل را ردیابی کنید. اینجاست که روش ChangeTracker.TrackGraph وارد عمل می شود.
این مقاله نحوه استفاده از روش ChangeTracker.TrackGraph را برای کار با موجودیتهای جداشده در Entity Framework Core مورد بحث قرار میدهد. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید
ابتدا، اجازه دهید یک پروژه ASP.NET Core در Visual Studio 2022 ایجاد کنیم. با دنبال کردن این مراحل، یک پروژه ASP.NET Core Web API 6 جدید در Visual Studio 2022 ایجاد می کنیم:
- Visual Studio 2022 IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، .NET 6.0 را به عنوان چارچوب هدف از لیست کشویی در بالا انتخاب کنید. “نوع احراز هویت” را به عنوان “هیچ” (پیشفرض) بگذارید.
- مطمئن شوید که چک باکسهای «Enable Docker»، «Configure for HTTPS» و «Enable Open API Support» علامت نخورده باشند زیرا ما در اینجا از هیچ یک از این ویژگیها استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
این یک پروژه ASP.NET Core 6 Web API جدید در Visual Studio 2022 ایجاد می کند. ما از این پروژه در بخش های بعدی این مقاله استفاده خواهیم کرد.
بسته های Entity Framework Core NuGet را نصب کنید
اگر یک پروژه برنامه کاربردی وب ASP.NET Core 6 را در Visual Studio 2022 با موفقیت ایجاد کرده اید، کاری که باید انجام دهید این است که بسته های NuGet لازم را به پروژه خود اضافه کنید. برای انجام این کار، پروژه را در پنجره Solution Explorer انتخاب کنید، کلیک راست کرده و “Manage NuGet Packages…” را در پنجره NuGet Package Manager انتخاب کنید، بسته های زیر را جستجو کرده و آنها را نصب کنید.
- Install-Package Microsoft.EntityFrameworkCore
- Install-Package Microsoft.EntityFrameworkCore.Tools
- Install-Package Microsoft.EntityFrameworkCore.SqlServer
بهطور متناوب، میتوانید بسته را از طریق کنسول NuGet Package Manager مطابق شکل زیر نصب کنید.
PM> Install-Package Microsoft.EntityFrameworkCore
PM> Install-Package Microsoft.EntityFrameworkCore.Tools
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
تغییرات یک موجودیت را در Entity Framework Core ردیابی کنید
ADO.NET میتواند در دو حالت مختلف کار کند – متصل و غیر متصل. از آنجایی که Entity Framework Core بر روی ADO.NET ساخته شده است، از هر دو حالت عملیات متصل و غیر متصل نیز پشتیبانی می کند.
در Entity Framework Core، نمونه های DbContext می توانند برای ردیابی موجودیت هایی که از پایگاه داده بازیابی می شوند استفاده شوند. هنگامی که متد SaveChanges فراخوانی می شود، هر گونه تغییر در این موجودیت ها شناسایی می شود و پایگاه داده به طور مناسب به روز می شود. با این حال، عملیات خواندن روی موجودیتها معمولاً با یک نمونه بافت داده انجام میشود، در حالی که یک نمونه بافت داده متفاوت برای افزودن، بهروزرسانی یا حذف موجودیت استفاده میشود.
این جداسازی در زمینههای “قطع” رایج است، مانند برنامههای کاربردی وب، جایی که موجودیتها جستجو میشوند، به مشتری ارسال میشوند، بهروزرسانی میشوند، در یک درخواست بازگردانده میشوند، و بعداً در پایگاه داده باقی میمانند. نمونه زمینه داده دوم باید بداند که آیا موجودیت ها جدید هستند یا از قبل در دسترس هستند.
ویژگی EntityState در Entity Framework Core
Entity Framework Core از ویژگی به نام State برای پیگیری تغییرات یک موجودیت استفاده می کند. این ویژگی در همه موجودیت ها موجود است و از نوع EntityState است. وقتی از روشهایی مانند پیوست، افزودن، ورود، بهروزرسانی یا حذف استفاده میکنید، تغییرات در این ویژگی رخ میدهد.
قطعه کد زیر نشان می دهد که چگونه می توانید یک موجودیت را در فروشگاه داده به روز کنید.
using (var dataContext = new DemoContext())
{
var product = dataContext.Products.Single(p => p.Id == 7);
product.Name = "Lenovo";
product.Category = "Laptop";
context.SaveChanges();
}
توجه داشته باشید که وقتی با Entity Framework Core در حالت قطع شده کار میکنید، باید به صراحت موجودیتی را که تغییر کرده است مشخص کنید. برای انجام این کار، میتوانید ویژگی EntityState را که اخیراً در مورد آن صحبت کردیم تنظیم کنید یا از روش DbContext.Update یا DbContext.Attach استفاده کنید.
از روش TrackGraph در Entity Framework Core استفاده کنید
روش TrackGraph در سناریوهای غیرمرتبط استفاده میشود که در آن موجودیتها با یک نمونه از زمینه از ذخیرهگاه داده واکشی میشوند و تغییرات موجود در موجودیتها در ذخیرهگاه داده با نمونه دیگری از زمینه ادامه مییابد. روش TrackGraph ویژگیهای پیمایش موجودیت را برای نظارت بر همه موجودیتهایی که در دسترس هستند، طی میکند، مشروط بر اینکه موجودیت قبلاً ردیابی نشده باشد.
قطعه کد ارائه شده در زیر نشان می دهد که چگونه می توانید از روش TrackGraph استفاده کنید.
var dbContext = new DemoContext();
dbContext.ChangeTracker.TrackGraph(product, p => {
if (p.Entry.IsKeySet)
{
p.Entry.State = EntityState.Unchanged;
}
else
{
p.Entry.State = EntityState.Added;
}
});
در این مثال، اگر یک موجودیت دارای یک کلید مرتبط با آن باشد، آن موجودیت بدون تغییر است. در مقابل، اگر کلیدی با موجودیت مرتبط نباشد، واضح است که موجودیت اضافه شده است.
قطعه کد زیر نشان می دهد که چگونه می توانید وضعیت و نوع همه موجودیت هایی را که بخشی از بافت داده هستند نمایش دهید.
foreach (var entity in dbContext.ChangeTracker.Entries())
{
_logger.LogInformation("Entity: {0}, State: {1}",
entity.Entity.GetType().Name, entity.State.ToString());
}
Entity Framework Core می تواند تنها یک نمونه از یک موجودیت را با کلید اصلی ردیابی کند. بهترین راه ممکن برای رسیدگی به این جنبه منفی استفاده از یک زمینه کوتاه مدت برای هر واحد کار است، جایی که زمینه خالی شروع می شود، موجودیت هایی به آن متصل هستند و آن موجودیت ها را ذخیره می کند. در نهایت، هنگامی که واحد کار تکمیل شد، زمینه حذف و حذف می شود.
پست های مرتبط
نحوه کار با موجودیت های قطع شده در Entity Framework Core
نحوه کار با موجودیت های قطع شده در Entity Framework Core
نحوه کار با موجودیت های قطع شده در Entity Framework Core