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

  • 相关阅读:
    深入理解TCP、UDP协议及两者的区别
    Java多线程之Executor框架
    Java中的线程池及其实现类ThreadPoolExecutor
    深入理解java虚拟机之Java对象头
    深入理解Java虚拟机之创建对象,即创建一个类的过程
    使用RedisTemplate操作Redis数据库
    深入理解Java虚拟机之运行时数据区域
    多线程之join方法
    线程之间的通信方式:wait/notify
    多线程之可见性:volatile
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12289200.html
Copyright © 2020-2023  润新知