Có hai kiểu kịch bản khi làm bền vững một thực thể sử dụng EntityFramework: connected và disconnected scenarios

I. Connected Scenario

Là khi một thực thể được nhận từ CSDL và tính bền vững được sử dụng trong cùng context. Đối tượng Context không bị hủy bỏ giữa thực thể truy tìm và sự bền vững của những thực thể.

Entity Framework tutorial 4.3 dbcontext

Thao tác CRUD trong Connected Scenario:

Là một tác vụ khá dễ bởi vì context theo dõi tự động những thay đổi đã xảy ra trong thực thể suốt vòng đời của nó,  mặc định AutoDetectChangesEnabled đã cung cấp là true.

Chắc chắn rằng bạn đã tạo một Entity Data Model như hướng dẫn trong phần Tạo Entity Data Model cho CSDL mẫu SchoolDB.

Ví dụ sau chỉ cho bạn làm thế nào bạn có thể add, update và delete một thực thể trong kịch bản connected (trong phạm vi của context), nó sẽ lần lượt thực thi lệnh insert, update và delete trên CSDL. Context sẽ tự động phát hiện những thay đổi và cập nhật trạng thái của một thực thể.

using (var context = new SchoolDBEntities())
{
    var studentList = context.Students.ToList<Student>();

    //Perform create operation
    context.Students.Add(new Student() { StudentName = "New Student" });

    //Perform Update operation
    Student studentToUpdate = studentList.Where(s => s.StudentName == "student1").FirstOrDefault<Student>();
    studentToUpdate.StudentName = "Edited student1";

    //Perform delete operation
    context.Students.Remove(studentList.ElementAt<Student>(0));

    //Execute Inser, Update & Delete queries in the database
    context.SaveChanges();
} 

Note: Nếu context.Configuration.AutoDetectChangesEnabled = false thì context không thể phát hiện những thay đổi đã thực hiện trên những thực thể hiện tại vì vậy không thực thi truy vấn update. Bạn cần gọi context.ChangeTracker.DetectChanges() trước SaveChanges() để phá hiện những thực thể có chỉnh sửa và đánh dấu trạng thái của chúng như Modified

Context phát hiện những thực thể thêm và xóa khi thao tác được thực hiện chỉ trên DbSet. Nếu bạn thực hiện thêm và xóa thực thể trên một tập hợp hoặc danh sách riêng biệt thì nó sẽ không phát hiện được những thay đổi này.

Đoạn mã sau sẽ không thêm hoặc xóa sinh viên. Nó chỉ cập nhật thực thể sinh viên bởi vì chúng ta đang thêm và xóa những thực thể từ List mà không phải từ DbSet.

using (var context = new SchoolDBEntities())
{
    var studentList = context.Students.ToList<Student>();

    //Add student in list
    studentList.Add(new Student() { StudentName = "New Student" });

    //Perform update operation
    Student studentToUpdate = studentList.Where(s => s.StudentName == "Student1").FirstOrDefault<Student>();
    studentToUpdate.StudentName = "Edited student1";

    //Delete student from list
    if (studentList.Count > 0)
        studentList.Remove(studentList.ElementAt<Student>(0));

    //SaveChanges will only do update operation not add and delete
    context.SaveChanges();
}

II. Disconnected Scenario

Là khi một thực thể được nhận từ CSDL và những thực thể đã thay đổi được submit sử dụng những đối tượng khác nhau trong context. Ví dụ sau minh họa kịch bản disconnected:

Entity Framework tutorial 4.3 dbcontext

Với mỗi kịch bản trên, Context1 là sử dụng cho thao tác read và sau đó Context1 bị hủy bỏ. Một khi những thực thể thay đổi, ứng dụng submit những thực thể sử dụng Context2 – một đối tượng context khác.

Kịch bản disconnected là khá phức tạp bởi vì context mới không biết bất kỳ điều gì về thực thể đã thay đổi vì vậy bạn sẽ phải chỉ dẫn cho context những gì đã thay đổi trong thực thể. Trong hình minh họa bên dưới, ứng dụng nhận một entity graph sử dụng Context 1 và sau đó ứng dụng thực hiện vài thao táo CUD (Create, Update, Delete) trên nó và cuối cùng nó lưu trữ entity graph sử dụng Context 2. Context 2 không biết thao tác gì đã thực hiện trên entity graph trong kịch bản này.

Bạn sẽ học được làm thế nào để thực hiện thao tác CRUD trong kịch bản disconnected trong phần tiếp theo.

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

Advertisements