【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

时间:2021-03-01 23:16:59

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

【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
}

执行结果:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

说明:输出结果 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语句
}

执行结果:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

说明:上图中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();//更新到数据库
}

执行结果:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

说明:修改状态调用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语句:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

执行结果:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

说明:根据生成的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语句:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

执行结果:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

说明:调用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语句:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

执行结果对比:

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

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

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