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.
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.Add
và DbContext.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 EntityState
là Deleted
. 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.