EF 6 - DbContext trong EF 6

DbContext trong Entity Framework 6

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

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

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 trong EF 6


Các phương thức của lớp DbContext 

Phương thức Ý nghĩa
Entry Lấy đối tượng DbEntityEntry trong EF liên quan đến đối tượng dữ liệu, từ đối tượng này có thể thi hành các tác vụ khác nhau.
SaveChanges Thực thi các câu lệnh INSERT, UPDATE and DELETE.
SaveChangesAsync Phương thức không đồng bộ của phương SaveChanges()
Set Tạo một DbSet <TEntity> có thể được sử dụng để truy vấn và lưu các thực thể của TEntity.
OnModelCreating Ghi đè phương thức OnModelCreating và sử dụng tham số  modelBuilder kiểu ModelBuilder để cấu hình các lớp thực thể.

Các thuộc tính của lớp DbContext 

Method Usage
ChangeTracker cung cấp cho bạn tất cả các thông tin về các thực thể đang được theo dõi bởi Context.
Configuration EF Core cho phép chúng ta cấu hình các lớp thực thể để tùy chỉnh ánh xạ mô hình EF thành cơ sở dữ liệu.
Database Cung cấp quyền truy cập vào thông tin và hoạt động liên quan đến cơ sở dữ liệu.