EF Core - Lưu dữ liệu trong Entity Framework Core

Lưu dữ liệu trong Entity Framework Core

Entity Framework Core cung cấp các cách khác nhau để thêm, cập nhật hoặc xóa dữ liệu trong cơ sở dữ liệu. Một thực thể chứa dữ liệu trong thuộc tính của nó sẽ được thêm hoặc cập nhật hoặc xóa dựa trên trạng thái EntityState của nó.

Lưu dữ liệu trong kịch bản được kết nối trong EF Core

Hình dưới đây minh họa các thao tác CUD (Create, Update, Delete) trong kịch bản được kết nối.

Lưu dữ liệu trong kịch bản được kết nối

Theo hình trên, Entity Framework xây dựng và thực thi các câu lệnh INSERT, UPDATE hoặc DELETE cho các thực thể có trạng thái EntityState là Added, Modified hoặc Deleted khi phương thức DbContext.SaveChanges() được gọi.

Trong kịch bản được kết nối, một thể hiện DbContext theo dõi tất cả các thực thể và do đó, nó sẽ tự động thiết lập một trạng thái EntityState phù hợp cho mỗi thực thể bất cứ khi nào một thực thể được tạo, sửa đổi hoặc xóa.

Thêm dữ liệu

Các phương thức DbSet.AddDbContext.Add thêm một thực thể mới vào Context (ví dụ của DbContext) sẽ tạo một bản ghi mới vào cơ sở dữ liệu khi bạn gọi phương thức SaveChanges().


using (var context = new SchoolContext())
{
    var std = new Student()
    {
        FirstName = "Bill",
        LastName = "Gates"
    };
    context.Students.Add(std);

    // or
    // context.Add<Student>(std);

    context.SaveChanges();
}

Trong ví dụ trên, context.Students.Add(std) thêm một thể hiện mới được tạo của thực thể Student vào Context với trạng thái EntityState là Added.

EF Core đã giới thiệu phương thức DbContext.Add mới, hoạt động tương tự như phương thức DbSet.Add. Sau đó, phương thức SaveChanges() xây dựng và thực thi câu lệnh INSERT sau vào cơ sở dữ liệu.


exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Students] ( [FirstName], [LastName])
VALUES (@p0, @p1);
SELECT [StudentId]
FROM [Students]
WHERE @@ROWCOUNT = 1 AND [StudentId] = scope_identity();',N
'@p0 nvarchar(4000), @p1 nvarchar(4000) ',@p0=N'Bill',@p1=N'Gates'
go

Cập nhật dữ liệu

Trong kịch bản được kết nối, EF Core API theo dõi tất cả các thực thể được truy xuất bằng Context.

Vì vậy, khi bạn chỉnh sửa dữ liệu của thực thể, EF sẽ tự động đánh dấu trạng thái EntityState của thực thể là Modified, mà kết quả của nó là câu lệnh cập nhật trong cơ sở dữ liệu khi bạn gọi phương thức SaveChanges().


using (var context = new SchoolContext())
{
    var std = context.Students.First<Student>(); 
    std.FirstName = "Steve";
    context.SaveChanges();
}

Trong ví dụ trên, chúng tôi lấy sinh viên đầu tiên từ cơ sở dữ liệu bằng cách sử dụng context.Students.First<student>().

Ngay sau khi chúng tôi sửa đổi thuộc tính FirstName, Context thiết lập trạng thái EntityState của thực thể là Modified do sửa đổi được thực hiện trong phạm vi của thể hiện DbContext.

Vì vậy, khi chúng ta gọi phương thức SaveChanges(), nó sẽ xây dựng và thực thi câu lệnh Update sau trong cơ sở dữ liệu.


exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Students] SET [FirstName] = @p0
WHERE [StudentId] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 int,@p0 nvarchar(4000)',@p1=1,@p0=N'Steve'
Go

Trong câu lệnh cập nhật, EF Core API chỉ cập nhật các thuộc tính có giá trị được sửa đổi, các thuộc tính còn lại bị bỏ qua.

Trong ví dụ trên, chỉ có thuộc tính FirstName được chỉnh sửa, vì vậy một câu lệnh cập nhật chỉ có cột FirstName.

Xóa dữ liệu

Sử dụng phương thức DbSet.Remove() hoặc DbContext.Remove để xóa một bản ghi trong bảng cơ sở dữ liệu.


using (var context = new SchoolContext())
{
    var std = context.Students.First<Student>();
    context.Students.Remove(std);

    // or
    // context.Remove<Student>(std);

    context.SaveChanges();
}

Trong ví dụ trên, context.Students.Remove(std) hoặc context.Remove<Students>(std) đánh dấu đối tượng thực thể std có trạng thái EntityStateDeleted. Do đó, EF Core sẽ xây dựng và thực thi câu lệnh DELETE sau trong cơ sở dữ liệu.


exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Students]
WHERE [StudentId] = @p0;
SELECT @@ROWCOUNT;
',N'@p0 int',@p0=1
Go

Do đó, rất dễ dàng để thêm, cập nhật hoặc xóa dữ liệu trong Entity Framework Core trong kịch bản được kết nối.