EF Core 提供了不同的方法在数据库里面添加,更新或删除数据。实体包含其标量属性中的数据将根据其 EntityState 状态执行插入、更新、删除操作。
保存实体数据有两种方案:有连接和无连接。在连接方案中,相同的实例DbContext
用于检索和保存实体,而在断开连接的方案中则不同。在本章中,您将学习如何在有连接的场景中保存数据。
下图说明了有连接方案中的CUD(创建,更新,删除)操作。
根据上图,Entity Framework 为调用方法EntityState
时添加,修改或删除的实体构建并执行INSERT,UPDATE或DELETE语句DbContext.SaveChanges()
。在连接方案中,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
,上下文就会将其设置为EntityState
,Modified
因为在DbContext
实例(上下文)的范围内执行了修改。因此,当我们调用该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中的数据非常容易。