讲解之前,先来看一下我们的数据库结构:班级表 学生表
如上图,实体状态由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,根据主键删除。
如果删除的记录是其他实体的外键,则会报错,无法删除。