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

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

posted @ 2016-08-09 17:48  思如雨  阅读(2179)  评论(0编辑  收藏  举报