Entity Framework Core:在连接模式下保存数据
Entity Framework Core提供了不同的方法来添加,更新或删除基础数据库中的数据。一个实体的标量属性中包含的数据将根据其EntityState插入,更新或删除。
保存实体数据有两种方案:连接模式和断开模式。在连接的方案中,相同的DbContext实例用于检索和保存实体,而在断开连接的方案中则不同。在本章中,您将学习有关在连接的场景中保存数据的知识。
下图说明了所连接场景中的CUD(创建,更新,删除)操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-piqpXkAu-1581081972149)(D:
oteefcorepic9.png)]
如上图所示,当调用DbContext.SaveChanges()方法时,Entity Framework为其EntityState被添加,修改或删除的实体生成并执行INSERT,UPDATE或DELETE语句。在连接的场景中,DbContext实例跟踪所有实体,因此每当创建,修改或删除实体时,它都会自动为每个实体设置适当的EntityState。
插入数据
DbSet.Add和DbContext.Add方法将新实体添加到上下文(DbContext的实例),当您调用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();
}
在上面的示例中,context.Students.Add(std)将一个新创建的Student实体实例添加到具有Added EntityState的上下文中。 EF Core引入了新的DbContext.Add方法,该方法与DbSet.Add方法具有相同的作用。此后,SaveChanges()方法将生成并执行以下对数据库的INSERT语句。
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
更新数据
在连接的场景中,EF Core API跟踪使用上下文检索的所有实体。因此,当您编辑实体数据时,EF会自动将EntityState标记为Modified,这将在您调用SaveChanges()方法时在数据库中产生更新的语句。
using (var context = new SchoolContext())
{
var std = context.Students.First<Student>();
std.FirstName = "Steve";
context.SaveChanges();
}
在上面的示例中,我们使用context.Students.First<student>()从数据库中检索第一个学生。一旦修改了FirstName,由于在DbContext实例(上下文)的范围内执行了修改,因此上下文将其EntityState设置为Modified。因此,当我们调用 SaveChanges()方法时,它将在数据库中生成并执行以下Update语句。
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
在更新语句中,EF Core API包括具有修改后值的属性,其余部分将被忽略。在上面的示例中,仅FirstName属性被编辑,因此update语句仅包含FirstName列。
删除数据
使用DbSet.Remove()或DbContext.Remove方法删除数据库表中的记录。
using (var context = new SchoolContext())
{
var std = context.Students.First<Student>();
context.Students.Remove(std);
// or
// context.Remove<Student>(std);
context.SaveChanges();
}
在上面的示例中,context.Students.Remove(std) 或者 context.Remove<Students>(std)将std实体对象标记为Deleted。因此,EF Core将在数据库中生成并执行以下DELETE语句。
exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Students]
WHERE [StudentId] = @p0;
SELECT @@ROWCOUNT;
',N'@p0 int',@p0=1
Go
因此,在连接的场景中在Entity Framework Core中添加,更新或删除数据非常容易。