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,根据主键删除。

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

  • 相关阅读:
    windows下搭建solr 6.2.1服务器一
    redis 持久化
    weblogic 启动报错java.net.UnknownHostException
    Tomcat 容器lib下添加 wlfullclient.jar 包引起项目中javax servlet 的冲突
    java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
    spring mvc控制框架的流程及原理1: 总概及源码分析
    CentOS7安装iptables防火墙
    【Intellij IDEA】eclipse项目导入
    weblogic11g 安装参考地址
    解决“只能通过Chrome网上应用商店安装该程序”的方法
  • 原文地址:https://www.cnblogs.com/gosky/p/5754128.html
Copyright © 2011-2022 走看看