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

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

  • 相关阅读:
    数据模型Model(I)
    泛型
    iOS开发之widget实现
    ios断点续传:NSURLSession和NSURLSessionDataTask实现
    iOS 直播类APP开发流程解析
    iOS实现电话状态监听 CoreTelephony
    iOS9全新的联系人相关框架——Contacts Framework
    iOS开发集成微信支付
    如何在 Git 里撤销(几乎)任何操作
    iOS开发网络缓存原理
  • 原文地址:https://www.cnblogs.com/gosky/p/5754128.html
Copyright © 2020-2023  润新知