DbContext và DbSet trong Entity Framework

DbContext và DbSet trong Entity Framework là gì? Chúng có mối quan hệ như thế nào với nhau? Cùng Comdy.vn tìm hiểu rõ hơn qua bài viết này nhé.

Entity framework là gì?

Entity framework là gì
Entity Framework cung cấp một cách tiện lợi để tương tác với cơ sở dữ liệu thông qua đối tượng ở cấp ứng dụng

Entity Framework là một bộ công cụ ORM trong môi trường phát triển phần mềm sử dụng ngôn ngữ lập trình C#.  Entity Framework cung cấp một cách tiện lợi để tương tác với cơ sở dữ liệu thông qua đối tượng ở cấp ứng dụng.

Mục đích chính khi sử dụng Entity Framework là giảm sự phức tạp khi làm việc với cơ sở dữ liệu. Cụ thể thông qua cách tạo một lớp trừu tượng giữa cơ sở dữ liệu và mã nguồn ứng dụng.

What is dbcontext and dbset in entity framework?

DbContext và DbSet trong Entity Framework là gì? Trong Entity Framework, DbContext và DbSet là hai khái niệm quan trọng liên quan đến việc làm việc với cơ sở dữ liệu. DbContext và DbSet có mối quan hệ mật thiết, gắn bó với nhau chặt chẽ.

DbContext entity framework core

  • Dbcontext là gì? DbContext là một lớp quan trọng trong Entity Framework, đại diện cho một đơn vị làm việc với cơ sở dữ liệu.
  • Nó chứa các DbSet (được xem là các bảng trong cơ sở dữ liệu) và cung cấp một cách để truy cập dữ liệu từ cơ sở dữ liệu thông qua các phương thức như SaveChanges() để lưu các thay đổi.
  • Dbcontext c# cũng định nghĩa cấu hình kết nối đến cơ sở dữ liệu. Ngoài ra còn quản lý việc theo dõi thay đổi và thực hiện nhiều chức năng khác liên quan đến làm việc với dữ liệu.

C# DbSet

  • DbSet là gì? DbSet là một phần của DbContext và đại diện cho một tập hợp các đối tượng tương ứng với một bảng trong cơ sở dữ liệu.
  • Mỗi entity framework dbset cung cấp một cách để truy vấn, thêm, sửa đổi và xóa dữ liệu từ cơ sở dữ liệu cho đối tượng liên quan.
  • Khi bạn thêm, sửa đổi hoặc xóa một đối tượng từ DbSet c# và sau đó gọi phương thức SaveChanges() trên DbContext, các thay đổi sẽ được ghi xuống cơ sở dữ liệu.

DbContext Asnotracking là gì?

Dbcontext c# asnotracking() là gì? Asnotracking trong c# là một phương thức mà bạn có thể sử dụng trên một DbSet. Mục đích là để đặt các đối tượng trả về từ cơ sở dữ liệu vào trạng thái “không theo dõi” (no-tracking). Khi các đối tượng được truy vấn từ cơ sở dữ liệu và được đặt vào trạng thái không theo dõi, các thay đổi trên các đối tượng này không được theo dõi bởi DbContext.

Khi sử dụng AsNoTracking, bạn chỉ muốn đọc dữ liệu từ cơ sở dữ liệu mà không có ý định cập nhật hoặc lưu thay đổi trở lại cơ sở dữ liệu.

Phân biệt Tracking và No Tracking trong Entity Framework

Phân biệt Tracking và No Tracking
Trong Entity Framework, “Tracking” và “No Tracking” là hai chế độ quản lý đối tượng khi làm việc với cơ sở dữ liệu.

Tracking trong Entity Framework

Tracking là chế độ mặc định trong Entity Framework. Khi đối tượng được truy vấn từ cơ sở dữ liệu và được load vào DbContextsẽ được theo dõi bởi DbContext. Điều này có nghĩa là mọi thay đổi trên đối tượng sẽ được theo dõi và tự động cập nhật vào cơ sở dữ liệu khi gọi phương thức SaveChanges().

Mặc dù giúp quản lý thay đổi dễ dàng, nhưng có thể ảnh hưởng đến hiệu suất và gây tăng gánh nặng về bộ nhớ. Đặc biệt là khi bạn truy vấn một lượng lớn dữ liệu.

No tracking trong Entity Framework

Khi sử dụng chế độ No Tracking, các đối tượng không được theo dõi bởi DbContext. Có nghĩa là các thay đổi trên đối tượng không sẽ không tự động cập nhật vào cơ sở dữ liệu khi gọi SaveChanges(). Thay vào đó, bạn phải thủ công xác định những thay đổi nào cần được cập nhật.

Chế độ No Tracking thường được sử dụng trong các kịch bản đọc dữ liệu nhiều mà không có ý định cập nhật dữ liệu. Bên cạnh đó nó cũng giúp cải thiện hiệu suất và giảm gánh nặng về bộ nhớ khi làm việc với lượng lớn dữ liệu.

DbContext và DbSet trong Entity Framework

DbContext và DbSet trong Entity Framework
Tìm hiểu về DbContext và DbSet trong Entity Framework

DbContext Entity Framework core 6

EDM có lớp SchoolDBEntities được dẫn xuất từ lớp System.Data.Entity.DbContext. Lớp dẫn xuất DbContext được gọi là lớp Context trong Entity Framework.

DbContext là một lớp quan trọng trong Entity Framework API. Nó là cầu nối giữa các lớp thực thể và cơ sở dữ liệu.

Entity framework dbcontext là lớp chính chịu trách nhiệm tương tác với cơ sở dữ liệu. Cụ thể sẽ chịu trách nhiệm cho các hoạt động sau:

  • Truy vấn: Chuyển đổi các truy vấn LINQ-to-Entities thành truy vấn SQL và gửi chúng đến cơ sở dữ liệu.
  • Theo dõi thay đổi: Theo dõi các thay đổi xảy ra trên các thực thể sau khi truy vấn từ cơ sở dữ liệu.
  • Dữ liệu bền vững: Thực hiện các thao tác insert, update và delete vào cơ sở dữ liệu, dựa trên các trạng thái của thực thể.
  • Bộ nhớ đệm: Cung cấp bộ nhớ đệm cấp đầu tiên theo mặc định. Nó lưu trữ các thực thể đã được truy xuất trong suốt thời gian tồn tại của một lớp Context.
  • Quản lý mối quan hệ: Quản lý các mối quan hệ bằng cách sử dụng CSDL, MSL và SSDL trong cách tiếp cận Database First hoặc Model First. Đồng thời sử dụng các cấu hình Fluent API trong cách tiếp cận Code First.
  • Ánh xạ đối tượng: Chuyển đổi dữ liệu thô từ cơ sở dữ liệu thành các đối tượng thực thể.

Ví dụ về DbContext trong Entity Framework

Sau đây là một ví dụ về lớp SchoolDBEntities (lớp Context dẫn xuất từ lớp DbContext) được tạo bằng EDM cho cơ sở dữ liệu SchoolDB trong phần trước.

namespace ComdyTechnical
{
    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 có một tập kiểu thực thể DbSet<TEntity> cho tất cả các thực thể. Nó cũng có các chức năng cho stored procedures và views có trong EDM.

Phương thức OnModelCreating cho phép chúng ta cấu hình các mô hình sử dụng DbModelBuilder Fluent API trong Entity Framework 6.

Phương thức của c# DbContext

Phương thức Mô tả
Entry Trả về một DbEntityEntry cho một thực thể. Phương thức này cung cấp truy cập để thay đổi thông tin theo dõi và hoạt động cho thực thể.
SaveChanges Thực thi các lệnh INSERT, UPDATE và DELETE vào cơ sở dữ liệu cho các thực thể với trạng thái Added, Modified và Deleted.
SaveChangesAsync Phương thức SaveChanges() không đồng bộ
Set Tạo một DbSet<TEntity> được sử dụng để truy vấn và lưu các thể hiện của TEntity.
OnModelCreating Ghi đè phương thức này để bổ sung cấu hình cho mô hình thực thể.

Thuộc tính của DbContext

Thuộc tính của DbContext
Đâu là những thuộc tính của DbContext trong Entity Framework?
Thuộc tính Mô tả
ChangeTracker Cung cấp truy cập vào thông tin và hoạt động cho các trường hợp thực thể mà Context này đang theo dõi.
Configuration Cung cấp truy cập vào các tùy chọn cấu hình.
Database Cung cấp truy cập vào cơ sở dữ liệu thông tin và hoạt động.

DbSet trong Entity Framework

Lớp DbSet đại diện cho một tập thực thể có thể được sử dụng để thực hiện các thao tác tạo, đọc, cập nhật, và xóa (CRUD – create, read, update, delete).

Lớp Context (dẫn xuất từ lớp DbContext) phải có các thuộc tính kiểu DbSet cho các thực thể ánh xạ tới các table và view trong cơ sở dữ liệu.

Bảng sau liệt kê các phương thức quan trọng của lớp DbSet:

Phương thức Mô tả
Add Thêm thực thể đã cho vào Context với trạng thái Added. Khi các thay đổi được lưu, các thực thể trong trạng thái Added sẽ được thêm vào cơ sở dữ liệu. Sau khi các thay đổi được lưu, trạng thái đối tượng thay đổi thành Unchanged.

Ví dụ: dbcontext.Students.Add(studentEntity)

AsNoTracking <Entity> Trả về một truy vấn mới. Trong đó các thực thể được trả về sẽ không được lưu trong bộ nhớ cache trong DbContext. (Kế thừa từ DbQuery.)

Các thực thể được trả về là AsNoTracking sẽ không được DBContext theo dõi. Đây sẽ là một sự tăng hiệu suất đáng kể cho các thực thể chỉ đọc.

Ví dụ: var studentList = dbcontext.Students.AsNoTracking<Student>().ToList<Student>();

Attach(Entity) Đính kèm thực thể đã cho vào ngữ cảnh ở trạng thái Unchanged

Ví dụ: dbcontext.Students.Attach(studentEntity);

Create Tạo một thể hiện mới của một thực thể. Thể hiện này không được thêm hoặc đính kèm vào tập hợp. Thể hiện được trả về sẽ là một proxy nếu Context được cấu hình để tạo proxy và kiểu thực thể đáp ứng các yêu cầu để tạo proxy.

Ví dụ: var newStudentEntity = dbcontext.Students.Create();

Find(int) Sử dụng giá trị khóa chính để tìm một thực thể được theo dõi bởi Context. Nếu thực thể không có trong Context thì một truy vấn sẽ được thực thi. Đồng thời được đánh giá dựa trên dữ liệu trong nguồn dữ liệu. Null sẽ được trả về nếu không tìm thấy thực thể trong ngữ cảnh hoặc trong nguồn dữ liệu. Lưu ý rằng phương thức Find cũng trả về các thực thể đã được thêm vào Context. Tuy nhiên nó chưa được lưu vào cơ sở dữ liệu.

Ví dụ: var student = dbcontext.Students.Find(1);

Include Trả về kèm theo truy vấn non-generic LINQ-to-Entities (Kế thừa từ DbQuery)

Ví dụ:
var studentList = dbcontext.Students.Incoide(“StudentAddress”).ToList <Student>();
var studentList = dbcontext.Students.Incoide(s => s.StudentAddress).ToList<Student>();

Remove Đánh dấu thực thể đã cho là Removed. Khi các thay đổi được lưu, thực thể sẽ bị xóa khỏi cơ sở dữ liệu. Thực thể phải tồn tại trong Context ở một số trạng thái khác trước khi phương thức này được gọi.

Ví dụ: dbcontext.Students.Remove(studentEntity);

SqlQuery Tạo một truy vấn SQL thô sẽ trả về các thực thể. Theo mặc định, các thực thể được trả về được theo dõi bởi Context; điều này có thể được thay đổi bằng cách gọi AsNoTracking trên DbSqlQuery<TEntity> được trả về từ phương thức này.

Ví dụ:
var studentEntity = dbcontext.Students.SqlQuery(“select top 1 * from student where studentid = 1”).FirstOrDefault<Student>();

Entity framework context là gì?

Entity framework context là gì
Context database là một lớp trong Entity Framework, đại diện cho một đơn vị làm việc với cơ sở dữ liệu

What is database context? Context database là một lớp trong Entity Framework. Nó đại diện cho một đơn vị làm việc với cơ sở dữ liệu. Đây là nơi chứa các DbSet (được xem như các bảng trong cơ sở dữ liệu) và cung cấp các phương thức để truy vấn, thêm, sửa đổi và xóa dữ liệu từ cơ sở dữ liệu.

Một DbContext thường liên kết với một cơ sở dữ liệu cụ thể và cung cấp các dịch vụ để tương tác với cơ sở dữ liệu thông qua đối tượng. Đồng thời uản lý việc theo dõi thay đổi trên các đối tượng, giúp xác định những thay đổi nào cần được cập nhật khi gọi phương thức SaveChanges().

Kết lại

Trên đây là toàn bộ chia sẻ của Comdy.vn để giúp bạn hiểu rõ hơn về DbContext và DbSet trong Entity Framework. Hi vọng những kiến thức trong bài viết này là hữu ích và có ý nghĩa đối với bạn. Xin cám ơn.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *