بررسی کلاس ‌DbContext در Entity Framework

همانطور که در قسمت های قبلی دیدیم با ایجاد شدن یک Entity Data Model برای دیتابیس مورد نظر یعنی SchoolDB یک کلاس با نام SchoolDBEntities که از کلاس System.Data.Entity.DbContext ارث بری کرده است ایجاد شد. کلاسی که از کلاس ‌DbContext ارث بری کند را اصطلاحاً کلاس context می‌نامیم. تصویر زیر این موضوع را نشان می‌دهد.


کلاس ‌DbContext یک کلاس بسیار مهم در Entity Framework API می باشد. وظیفه این فایل ایجاد کردن یک پل ارتباطی بین entity class ‌ها و دیتابیس می‌باشد. تصویر زیر این موضوع را نشان می‌دهد.


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

  • انجام دادن Query ها: یکی از وظایف کلاس context تبدیل کردن دستورات LINQ-to-Entities به دستورات SQL query و سپس ارسال کردن آنها به دیتابیس می‌باشد.
  • انجام Change Tracking: وظیفه دیگری که کلاس context به عهده دارد ردگیری کردن و یا track کردن تغییراتی است که پس از query گرفتن از دیتابیس بر روی entity های برگردانده شده اتفاق می‌افتد.
  • عمل Persisting کردن داده ها: عملیات مربوط به درج کردن و به روزرسانی کردن و Delete کردن رکوردها در دیتابیس بر اساس entity state مربوط به entity ها یکی دیگر از وظایف کلاس context است.
  • انجام Caching: کلاس کانتکس، first level caching را به صورت پیش فرض فراهم می کند. در واقع این کار باعث می‌شود تا entity های خوانده شده از دیتابیس در طول عمر کلاس context در حافظه Cach بشوند.
  • مدیریت Relationship ها: مدیریت Relationship ها با استفاده از CSDL و MSL و SSDL در روش Database-First و یا Model-First و همچنین استفاده از fluent API و پیکربندی های آن در روش Code-First از وظایف دیگر کلاس context می باشد.
  • انجام Object Materialization: تبدیل کردن داده های خام و یا raw data از درون دیتابیس به درون entity object ها یک وظیفه دیگر کلاس context است. کدی که در قسمت زیر مشاهده می کنید کلاس SchoolDBEntities را نشان می دهد که همان کلاس context می باشد که از کلاس DbContext ارث بری کرده است.

namespace EFTutorials

{

using System;

using System.Data.Entity;

using System.Data.Entity.Infrastructure;

using System.Data.Entity.Core.Objects;

using System.Linq;

public partial class SchoolDBEntities : DbContext

{

public SchoolDBEntities()

: base("name=SchoolDBEntities")

{

}

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

throw new UnintentionalCodeFirstException();

}

public virtual DbSet<Course> Courses { get; set; }

public virtual DbSet<Standard> Standards { get; set; }

public virtual DbSet<Student> Students { get; set; }

public virtual DbSet<StudentAddress> StudentAddresses { get; set; }

public virtual DbSet<Teacher> Teachers { get; set; }

public virtual DbSet<View_StudentCourse> View_StudentCourse { get; set; }

public virtual ObjectResult<GetCoursesByStudentId_Result> GetCoursesByStudentId(Nullable<int> studentId)

{

var studentIdParameter = studentId.HasValue ?

new ObjectParameter("StudentId", studentId) :

new ObjectParameter("StudentId", typeof(int));

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetCoursesByStudentId_Result>("GetCoursesByStudentId", studentIdParameter);

}

public virtual int sp_DeleteStudent(Nullable<int> studentId)

{

var studentIdParameter = studentId.HasValue ?

new ObjectParameter("StudentId", studentId) :

new ObjectParameter("StudentId", typeof(int));

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_DeleteStudent", studentIdParameter);

}

public virtual ObjectResult<Nullable<decimal>> sp_InsertStudentInfo(Nullable<int> standardId, string studentName)

{

var standardIdParameter = standardId.HasValue ?

new ObjectParameter("StandardId", standardId) :

new ("StandardId", typeof(int));

var studentNameParameter = studentName != null ?

new ObjectParameter("StudentName", studentName) :

new ObjectParameter("StudentName", typeof(string));

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<decimal>>("sp_InsertStudentInfo", standardIdParameter, studentNameParameter);

}

public virtual int sp_UpdateStudent(Nullable<int> studentId, Nullable<int> standardId, string studentName)

{

var studentIdParameter = studentId.HasValue ?

new ObjectParameter("StudentId", studentId) :

new ObjectParameter("StudentId", typeof(int));

var standardIdParameter = standardId.HasValue ?

new ObjectParameter("StandardId", standardId) :

new ObjectParameter("StandardId", typeof(int));

var studentNameParameter = studentName != null ?

new ObjectParameter("StudentName", studentName) :

new ObjectParameter("StudentName", typeof(string));

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("sp_UpdateStudent", studentIdParameter, standardIdParameter, studentNameParameter);

}

}

}

این کلاس با ایجاد کردن یک EDM برای یک دیتابیس به نام SchoolDB ایجاد شده است. همانطور که در مثال بالا مشاهده می کنید کلاس context شامل property هایی از نوع کلاس جنریک DbSet برای تمامی entity ها می باشد. کلاس DbSet شامل function ها و stored procedure ها و همچنین view های موجود در EDM می باشد که در رابطه با آن در قسمت بعد به طور مفصل تر صحبت خواهیم نمود. علاوه بر این متد OnModelCreating و پیکربندی هایی که توسط DbModelBuilder و Fluent API قابل انجام است یکی دیگر از اتفاقاتی است که در کلاس DbContext رخ می دهد.


منبع: " وبسایت پرووید "