I. Thêm thực thể mới sử dụng DBContext trong Disconnected Scenario

Trong mục này bạn sẽ học được làm thế nào để thêm một thực thể mới trong DBContext trong disconnected scenario, lần lượt insert một dòng mới trong bảng CSDL.

Nếu bạn sử dụng phương thức tiếp cận Database-First sau đó tạo một Entity Data Model như trình bày trong phần Tạo Entity Data Model cho CSDL mẫu SchoolDB. Hoặc nếu bạn sử dụng phương thức tiếp cận Code-First hoặc Model-First sau đó tạo những thực thể và những lớp context. Trong bất kỳ trường hợp nào những thực thể và những lớp context đều sẽ tương tự

Ở đây chúng ta sẽ thấy làm thế nào để thêm một thực thể đơn Student (không phải entity graph) . Sau đây là một thực thể Student.

using System;
using System.Collections.Generic;
    
public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

Đây là lớp context.

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

Đoạn mã sau trình bày làm thế nào để lưu một thực thể đơn.

class Program
{
    static void Main(string[] args)
    {
        // create new Student entity object in disconnected scenario (out of the scope of DbContext)
        var newStudent = new Student();

        //set student name
        newStudent.StudentName = "Bill";

        //create DBContext object
        using (var dbCtx = new SchoolDBEntities())
        {
            //Add Student object into Students DBset
            dbCtx.Students.Add(newStudent);
                
            // call SaveChanges method to save student into database
            dbCtx.SaveChanges();
        }
    }
}

Như bạn có thể thấy trong đoạn mã trên, đầu tiên chúng ta đã tạo một đối tượng thực thể mới Student và cài đặt StudentName là ‘Bill’. Thứ hai chúng ta đã tạo một đối tượng DBContext mới và thêm newStudent vào Students EntitySet. Thứ ba chúng ta gọi phương thức SaveChanges của DBContext và nó sẽ thực thi truy vấn insert sau tới CSDL.

exec sp_executesql N'INSERT [dbo].[Student]([StudentName], [StandardId])
VALUES (@0, NULL)
SELECT [StudentID], [RowVersion]
FROM [dbo].[Student]
WHERE @@ROWCOUNT > 0 AND [StudentID] = scope_identity(),@0='Bill'

Ngoài ra chúng ta cũng có thể thêm thực thể vào DBContext.Entry và đánh dấu nó như Added và nó có kết quả  truy vấn insert tương tự:

class Program
{
    static void Main(string[] args)
    {
        // create new Student entity object in disconnected scenario (out of the scope of DbContext)
        var newStudent = new Student();

        //set student name
        newStudent.StudentName = "Bill";

        //create DBContext object
        using (var dbCtx = new SchoolDBEntities())
        {
            //Add newStudent entity into DbEntityEntry and mark EntityState to Added
            dbCtx.Entry(newStudent).State = System.Data.Entity.EntityState.Added;

            // call SaveChanges method to save new Student into database
            dbCtx.SaveChanges();
        }
    }
}

Vì vậy theo cách này bạn có thể thêm một thực thể đơn mới trong disconnected scenario.

II. Cập nhật thực thể đã tồn tại sử dụng DBContext trong Disconnected Scenario

Chúng ta sẽ thấy làm thế nào để cập nhật một thực thể Student đơn (không phải entity graph). Sau đây là một thực thể Student.

using System;
using System.Collections.Generic;
    
public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

Đây là một lớp context.

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

Ví dụ sau trình bày làm thế nào để cập nhật một thực thể Student trong disconnected scenario:

Student stud;
//1. Get student from DB
using (var ctx = new SchoolDBEntities())
{
    stud = ctx.Students.Where(s => s.StudentName == "New Student1").FirstOrDefault<Student>();
}

//2. change student name in disconnected mode (out of ctx scope)
if (stud != null)
{
    stud.StudentName = "Updated Student1";
}

//save modified entity using new Context
using (var dbCtx = new SchoolDBEntities())
{
    //3. Mark entity as modified
    dbCtx.Entry(stud).State = System.Data.Entity.EntityState.Modified;     
        
    //4. call SaveChanges
    dbCtx.SaveChanges();
}

Như bạn nhìn thấy trong đoạn mã trên, we đang làm những bước sau:

  1. Lấy một sinh viên đã tồn tại từ CSDL.
  2. Thay đổi tên sinh viên bên ngoài phạm vi của Context (mô hình disconnected).
  3. Chuyển thực thể đã chỉnh sửa vào phương thức Entry để lấy đối tượng DBEntityEntry của nó và sau đó đánh dấu trạng thái của nó là Modified.
  4. Gọi phương thức SaveChanges() để cập nhật thông tin sinh viên vào CSDL.

SaveChanges sẽ gửi truy vấn update sau tới CSDL:

exec sp_executesql N'update [dbo].[Student]
set [StudentName] = @0, [StandardId] = @1
where ([StudentID] = @2)',N'@0 varchar(50),
@1 int,@2 int',@0='Updated Student1',@1=299,@2=267

Theo cách này chúng ta có thể dễ dàng cập nhật một thực thể đơn sử dụng DBContext trong mô hình disconnected.

Phương thức DbContext.Entry trả về một thể hiện của DBEntityEntry cho một thực thể cụ thể. Một thể hiện của lớp DbEntityEntry cung cấp một truy cập tới thông tin về một thực thể đã cho và trạng thái của nó. Bạn có thể thay đổi trạng thái của một thực thể thành Added, Updated hoặc Deleted.

III. Xóa thực thể sử dụng DBContext trong Disconnected Scenario

Chúng ta sử dụng phương thức Entry của DbContext để đánh dấu EntityState là Modified ở mục trên. Theo cách này chúng ta có thể sử dụng phương thức Entry để gắn một thực thể disconnected tới context và đánh dấu trạng thái của nó thành Deleted.

Student studentToDelete;
//1. Get student from DB
using (var ctx = new SchoolDBEntities())
{
    studentToDelete = ctx.Students.Where(s => s.StudentName == "Student1").FirstOrDefault<Student>();
}

//Create new context for disconnected scenario
using (var newContext = new SchoolDBEntities())
{
    newContext.Entry(studentToDelete).State = System.Data.Entity.EntityState.Deleted;    

    newContext.SaveChanges();
}  

Đoạn mã trình bày ở trên có kết quả trong truy vấn delete dòng từ bảng Teacher.

delete [dbo].[Student]
where ([StudentId] = @0)',N'@0 int',@0=1

Như vậy bạn có thể xóa một thực thể đơn trong kịch bản disconnected.

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

Advertisements