站点图标 江湖人士

Entity Framework Core: 在有连接的场景中保存数据

EF Core 提供了不同的方法在数据库里面添加,更新或删除数据。实体包含其标量属性中的数据将根据其 EntityState 状态执行插入、更新、删除操作。

保存实体数据有两种方案:有连接和无连接。在连接方案中,相同的实例DbContext用于检索和保存实体,而在断开连接的方案中则不同。在本章中,您将学习如何在有连接的场景中保存数据。

下图说明了有连接方案中的CUD(创建,更新,删除)操作。

根据上图,Entity Framework 为调用方法EntityState时添加,修改或删除的实体构建并执行INSERT,UPDATE或DELETE语句DbContext.SaveChanges()。在连接方案中,DbContext跟踪所有实体的实例因此EntityState无论何时创建,修改或删除实体,它都会自动设置适当的每个实体。

插入数据

DbSet.AddDbContext.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实体实例添加到具有AddedEntityState 的上下文中。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会自动标记EntityStateModified,这会在您调用SaveChanges()方法时在数据库中生成更新的语句。

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

在上面的例子中,我们使用从数据库中检索第一个学生context.Students.First<student>()。一旦我们修改了FirstName,上下文就会将其设置为EntityStateModified因为在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中的数据非常容易。

退出移动版