Như bạn đã nhìn thấy trong phần 3 Tạo Entity Data Model, EDM khởi tạo lớp SchoolDBEntities được dẫn xuất từ lớp System.Data.Entity.DbContext như bên dưới. Lớp dẫn xuất từ DbContext được gọi là lớp context trong Entity Framework.

Entity Framework 5.0 Tutorial

Trước EntityFramework 4.1, EDM thường khởi tạo lớp context được dẫn xuất từ lớp ObjectContext. Nó có một chút rắc rối khi làm việc với ObjectContext. DbContext khái niệm tương tự ObjectContext. Nó là một trình bao bọc quanh ObjectContext và hữu ích trong tất cả mô hình phát triển: Code First, Model First và Database First.

DbContext là một phần quan trọng của Entity Framework. Nó là một cầu nối giữa lớp domain hoặc thực thể và CSDL của bạn.

Entity Framework dbcontext

DbContext là lớp chính chịu trách nhiệm cho việc tương tác với dữ liệu như là đối tượng. DbContext chịu trách nhiệm cho các hoạt động sau:

  • EntitySet: DbContext chứa tập thực thể (DbSet<TEntity>) cho tất cả thực thể nối với những bảng của CSDL.
  • Querying: DbContext chuyển đổi những truy vấn LINQ-to-Entities thành truy vấn SQL và gửi nó tới CSDL.
  • Change Tracking: Nó giữ việc theo dõi những thay đổi xảy ra trong những thực thể sau khi nó đã truy vấn từ CSDL.
  • Persisting Data: Nó cũng thực hiện các thao tác Insert, Update và Delete tới CSDL dựa trên những gì mà thực thể thể hiện.
  • Caching: DbContext mặc định thực hiện caching mức đầu tiên. Nó lưu những thực thể đã được nhận suốt vòng đời của một lớp context.
  • Manage Relationship: DbContext cũng quản lý những quan hệ sử dụng CSDL, MSL và SSDL trong phương pháp tiếp cận DB-First hoặc Model-First hoặc sử dụng fluent API trong phương pháp tiếp cận Code-First.
  • Object Materialization: DbContext chuyển đổi bảng dữ liệu thô vào những đối tượng thực thể.

Sau đây là một ví dụ của lớp SchoolDBEntities class (lớp class dẫn xuất DbContext) khởi tạo với EDM cho CSDL SchoolDB trong những bài hướng dẫn trước.

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);
        }
    }
}

As you can see in the above example, context class (SchoolDBEntities) includes entity set of type DbSet<TEntity> for all the entities. Learn more about DbSet class here. It also includes functions for the stored procedures and views included in EDM.

Như bạn có thể thấy trong ví dụ trên, lớp context (SchoolDBEntities) gồm tập thực thể của kiểu DbSet<TEntity> cho tất cả những thực thể. Nó cũng gồm những hàm cho stored procedures and views included trong EDM.

Lớp Context ghi đè phương thức OnModelCreating. Tham sốDbModelBuilder được gọi là Fluent API, nó có thể sử dụng để cấu hình những thực thể trong phương pháp tiếp cận Code-First.

Cài đặt DbContext:

Bạn có thể sử dụng DbContext bằng cách cài đặt lớp context và sử dụng cho thao tác CRUD như bên dưới.

using (var ctx = new SchoolDBEntities()) { //Can perform CRUD operation using ctx here.. }

Getting ObjectContext từ DbContext:

DBContext API là dễ sử dụng hơn ObjectContext API cho tất cả các tác vụ thông thường. Tuy nhiên bạn có thể lấy tham chiếu của ObjectContext từ DBContext để sử dụng những chức năng của ObjectContext. Điều này có thể thực hiện bằng cách sử dụng IObjectContextAdpter như bên dưới:

using (var ctx = new SchoolDBEntities()) { var objectContext = (ctx as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext; //use objectContext here.. }

EDM cũng khởi tạo các lớp thực thể. Học về những kiểu khác nhau của thực thể trong phần tiếp theo.

Nguồn: http://www.entityframeworktutorial.net/

Advertisements