zoukankan      html  css  js  c++  java
  • 【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

    讲解之前,先来看一下我们的数据库结构:班级表 学生表

    如上图,实体状态由EntityState枚举定义:Detached(未跟踪)、Unchanged(未改变)、Added(已添加)、Deleted(已删除)、Modified(已修改)

    查看实体状态

    //查看实体状态
    using (var db = new Entities())
    {
        var query = db.Student.First();
        Console.WriteLine(db.Entry(query).State);//输出Unchanged
    }

    执行结果:

    说明:输出结果 Unchanged ,已加载到上下文中的实体为Unchanged状态。

    标记实体状态

    Console.WriteLine("==========标记状态 EntityState.Unchanged===========");
    
    Student student;
    using (var db = new Entities())
    {
        student = db.Student.Where(s => s.StudentName == "张三").First();
    }
    
    //查看实体状态
    using (var db = new Entities())
    {
        Console.WriteLine(db.Entry(student).State);//输出Detached
    
        db.Student.Attach(student);//将实体附加到上下文中
    
        Console.WriteLine(db.Entry(student).State);//输出Unchanged
    
        db.SaveChanges();//未执行SQL语句
    }

    执行结果:

    说明:上图中student对象定义在上下文作用域之外,所以默认是Detached未跟踪状态。

    调用Attach方法将对象附加到上下文中,状态变为Unchanged。

    Unchanged状态为未改变,所以调用db.SaveChanges方法不执行SQL语句。

    标记状态 EntityState.Added

    using (var db = new Entities())
    {
        var classes = new Classes()
        {
            ClassName = "英语10501"
        };
        Console.WriteLine(db.Entry(classes).State);//输出 Detached
    
        db.Entry(classes).State = System.Data.Entity.EntityState.Added;//修改状态为Added
        //db.Classes.Add(classes);  //调用DBSet.Add方法同样的效果
    
        Console.WriteLine(db.Entry(classes).State);//输出 Added

    db.SaveChanges();//更新到数据库
    }

    执行结果:

    说明:修改状态调用Entry方法,由Detached-->Added。DBSet.Add方法同样效果。

    标记状态 EntityState.Modified

    方式一:更新指定字段

    //方式一:更新部分字段
    using (var db = new Entities())
    {
    
        var student = db.Student.Where(s => s.StudentName == "张三").First();
    
        Console.WriteLine(db.Entry(student).State);//输出Detached
    
        student.StudentName = "张三丰";
    
        Console.WriteLine(db.Entry(student).State);//输出Modified
    
        db.SaveChanges();
    }

    追踪SQL语句:

    执行结果:

    说明:根据生成的SQL语句可知,只更新了StudentName字段。未实体赋值将改变实体状态 Unchanged-->Modified。

    方式二:更新所有

    using (var db = new Entities())
    {
    
        var student = db.Student.Where(s => s.StudentName == "张三").First();
    
        Console.WriteLine(db.Entry(student).State);//输出Detached
    
        db.Entry(student).State = System.Data.Entity.EntityState.Modified;
        student.StudentName = "张三丰";
    
        Console.WriteLine(db.Entry(student).State);//输出Modified
    
        db.SaveChanges();
    }

    追踪SQL语句:

    执行结果:

    说明:调用Entry方法改变实体状态 Unchanged-->Modified,会生成更新所有字段的SQL。

        student.StudentName = "张三丰";
        db.Entry(student).State = System.Data.Entity.EntityState.Modified;

    这两句顺序颠倒,效果相同。

    标记状态 EntityState.Deleted

    using (var db = new Entities())
    {
        var student = db.Student.Where(n=>n.StudentName=="小芳").Single();
    
        Console.WriteLine(db.Entry(student).State);//输出Unchanged
    
        db.Entry(student).State = System.Data.Entity.EntityState.Deleted;
        //db.Student.Remove(student);
    
        Console.WriteLine(db.Entry(student).State);//输出Detached
    
        db.SaveChanges();
    }

    追踪SQL语句:

    执行结果对比:

    说明:执行了2条SQL语句:实体状态由Unchange---->Deleted,根据主键删除。

    如果删除的记录是其他实体的外键,则会报错,无法删除。

  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/gosky/p/5754128.html
Copyright © 2011-2022 走看看