تا %60 تخفیف خرید برای 5 نفر با صدور مدرک فقط تا
00 00 00
در توسینسو تدریس کنید

آموزش Entity Framework قسمت 2 : کلاس DbContext و DbSet

در قسمت دوم از سری آموزش Entity Framework در مورد کلاس DbContext و DbSet که دو کلاس اصلی در تعریف مدل بانک اطلاعاتی در سمت برنامه سی شارپ ما هستند صحبت می کنیم.

مروری بر کلاس DbContext و DbSet

همانطوری که در بخش قبلی مطرح کردیم، کلاس Context ما باید از کلاس DbContext ارث بری کند. کلاس DbContext در حقیقت یک Container برای Entity های ما هست که وظیفه شناسایی و تعریف Mapping ها را به صورت خودکار انجام می دهد. در حقیقت کلاس DbContext یک Wrapper بر روی ObjectContext که خیلی از ویژگی های این کلاس را به صورت خیلی ساده تر در اختیار ما قرار می دهد. البته خیلی از ویژگی های ObjectContext به صورت مستیقیم قابل دسترس نیست و باید به صورت غیر مستقیم به اونها دسترسی پیدا کرد.

کلاس هایی که از DbContext مشتق می شوند معمولا" دارای یک یا چند DbSet هستند. کلاس DbSet که یک کلاس Generic هست، اینترفیس IQueryable را پیاده سازی می کند تا بتوان از قابلیت LINQ در این کلاس برای نوشتن کوئری ها استفاده کرد. هنگام ساختن یک شئ از کلاس مشتق شده از DbContext، تمامی DbSet ها شناسایی و پردازش می شوند تا Entity ها به جداول بانک اطلاعاتی Map شوند. عملیات Mapping به صورت خودکار انجام می شود که می توان از طریق متد OnModelCreating که یک متد Virtual هست، تغییرات دلخواه در مورد Mapping را اعمال کرد.

مدل زیر را در نظر بگیرید:

public class Customer
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class OrdersContext : DbContext
{
    public DbSet Customers { get; set; }
}


هنگام ساختن یک شئ از OrdersContext، کلیه DbSet ها پردازش شده و به بانک اطلاعاتی Map می شوند. برای مثال کلاس Customer به جدول Customers در بانک اطلاعاتی Map خواهد شد. وظیفه تشخیص اسم جمع Customer که Customers می شود، به عهده خود DbContext است. همچنین، هر Property از نوع Primitive Types داخل Entity ها معادل یک Column در جداول بانک اطلاعاتی است. هنگام پردازش Property ها، ID به صورت خودکار به عنوان کلید اولیه در نظر گرفته خواهد شد.

اما برای کلاس Context جهت ارتباط با بانک مورد نظر ما، باید یک Connection String مشخص کنیم، چند راه برای این کار وجود دارد که ساده ترین روش، قرار دادن یک Connection String داخل app.config یا web.config با نام کلاس Context هست. برای مثال:

  
    
  


یکی از قابلیت های Code-First، امکان ایجاد بانک بر اساس مدل در زمان اجرا است. برای ایجاد بانک می توان از دستور زیر استفاده کرد:

OrdersContext context = new OrdersContext();
context.Database.Create();


با اجرای دستور بالا، بانک Orders بر اساس مدل ایجاد خواهد شد. حالا اگر بخواهیم بانک در صورتی ایجاد شود که قبلا" ایجاد نشده باشد به جای متد Create، از متد CreateIfNotExists استفاده می کنیم.

کلاس Context یک Property با نام Database دارد که به وسیله این Property می توانیم به یک سری قابلیت ها، مانند دسترسی به DbConnection جاری، یا ایجاد بانک اطلاعاتی دسترسی داشته باشیم.

متد Find در کلاس DbSet:

این دستور به ما این امکان را می دهد تا بر اساس کلید اولیه در داخل بانک جستجو کنیم:

var customer = context.Customers.Find(12);


دستور بالا معادل دستور زیر است:

var customer = context.Customers.FirstOrDefault(c => c.CustomerID == 12);

 

متد Add و Remove در کلاس DbSet

برای اضافه کردن یک Entity، از متد Add استفاده می کنیم:

var newCustomer = new Customer();
newCustomer.FirstName = "Reza";
newCustomer.LastName = "Mohammadi";
context.Customers.Add(newCustomer);
context.SaveChanges();


باید دقت کنیم که صدا زدن متد SaveChange در کلاس Context جهت ثبت تغییرات در بانک اطلاعاتی الزامی می باشد.

اگر بخواهیم یک Entity را از بانک حذف کنیم از متد Remove استفاده می کنیم. متد Remove یک پارامتر از نوع Entity مورد نظر را دریافت کرده و آن را حذف می کند:

var customer1 = context.Customers.Find(12);
var customer2 = context.Customers.First(c => c.FirstName == "Reza");
context.Customers.Remove(customer1);
context.Customers.Remove(customer2);
context.SaveChanges();


با اجرای دستور بالا Entity های مورد نظر از بانک اطلاعاتی حذف خواهند شد.

قابلیت DQE در اجرای Query ها

یکی از قابلیت های LINQ قابلی DQE یا Deffered Query Execution هست، این معنی که تا زمانی که نتایج درخواست نشوند، کوئری اجرا نخواهد شد، برای مثال دستور زیر را در نظر بگیرید:

var customers = context.Customers.Where(c => c.FirstName.Contains("reza")).OrderBy(c => c.FirstName);


با اجرای دستور بالا، اگر با پنجره Watch متغیر Customer را نگاه کنیم، عبارت زیر را خواهیم دید:

SELECT 
[Extent1].[CustomerID] AS [CustomerID], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName]
FROM [dbo].[Customers] AS [Extent1]
WHERE [Extent1].[FirstName] LIKE N'%reza%'
ORDER BY [Extent1].[FirstName] ASC


این دستور SQL عبارت تولید شده دستور #C بالاست. حالا اگر متد ()customers.ToList را اجرا کنیم، تازه دستور SQL ایجاد شده بالا، اجرا خواهد شد و نتیجه به صورت لیستی از Customer ها برگردانده خواهد شد.

در بخش بعدی چگونی تغییر Mapping را بوسیله Attribute ها بررسی خواهیم کرد.
#آموزش_سی_شارپ #ایجاد_جدول_با_entity_framwork #entity_framework_چیست؟ #برنامه_نویسی_پایگاه_داده_در_سی_شارپ #آموزش_entity_framework_code_first #کلاس_dbcontext #نمایش_اطلاعات_ویو_ها_در_entity_framework #اموزش_برنامه_نویسی_entity_framework #آموزش_entity_framework

نظر شما
برای ارسال نظر باید وارد شوید.
2 نظر
افرادی که این مطلب را خواندند مطالب زیر را هم خوانده اند