zoukankan      html  css  js  c++  java
  • Entity Framework Core系列教程-7-连接模式增删改

    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中添加,更新或删除数据非常容易。

  • 相关阅读:
    python+soket实现UDP协议的客户/服务端中文聊天程序
    如何实现PyQt5与QML响应彼此发送的信号?
    用 eric6 与 PyQt5 实现python的极速GUI编程(系列04)---- PyQt5自带教程:地址簿(address book)
    用 eric6 与 PyQt5 实现python的极速GUI编程(系列03)---- Drawing(绘图)(3)-- 画线
    用 eric6 与 PyQt5 实现python的极速GUI编程(系列03)---- Drawing(绘图)(2)-- 画点
    用 eric6 与 PyQt5 实现python的极速GUI编程(系列03)---- Drawing(绘图)(1)-- 绘写文字
    仿百度壁纸client(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化
    软件概要设计说明书—模板
    Android--Handler的用法:在子线程中更新界面
    在PreferenceAcitity中使用Fragement时避免额外的Left和RightPadding
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878817.html
Copyright © 2011-2022 走看看