در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

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

در مقاله قبلی در مورد چگونگی ارتباط بین بانک اطلاعاتی و برنامه توسط Entity Framework Code-First نوشتیم. در این بخش در مورد کلاس 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
عنوان
1 آموزش Entity Framework قسمت 1 : معرفی و شروع به کار رایگان
2 آموزش Entity Framework قسمت 2 : کلاسهای DbContext و DbSet رایگان
3 آموزش Entity Framework قسمت 3 : تعریف Mapping با Attribute ها رایگان
4 آموزش Entity Framework قسمت 4 : تعریف Mapping با Fluent API رایگان
5 آموزش Entity Framework قسمت 5 : تعریف رابطه ها بخش 1 رایگان
6 آموزش Entity Framework قسمت 6 : تعریف رابطه ها بخش 2 رایگان
زمان و قیمت کل 0″ 0
2 نظر
peyman1959

سلام

خیلی ممنون از آموزش خوبتون

من یه مشکلی دارم . دیتابیسم ایجاد میشه ولی توی sql server managment نشونش نمیده

حتی پیام دیتابیس نمیتونه ساخته بشه چون وجود داره رو هم بهم نشون میده ولی توی منیجمنت نیست

حتی پروژه نمونه خود انتیتی فریمورک رو هم دانلود کردم و اجرا کردم اونم میسازه ولی نشون داده نمیشه

مشکل از کجاست؟

با تشکر فراوان

حسین احمدی

سلام، وقت بخیر

مشکل به خاطر Connection String هست، احتمال زیاد بانکتون توی LocalDb ساحته میشه. Connection String رو بررسی کنید ببینید درست ست کردید.

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....