- EF对数据做什么样的操作,是根据EF的上下文实体状态决定,实体状态有以下5种状态,下面我们就分别看下这5种状态
数据准备,我们看到学生表里有20000名学生记录,最后1位学生的学生编号为0000020000
1、Detached--实体跟上下文压根没关系
我们看到我新创建了名学生,学号为0000020001,他是第20001位学生,此时打印上下文实体状态,实体和上下文是分离状态,没有任何关系,Detached是表示连内存跟踪都没有建立,跟上下文dbContext没有任何关系
Student newStudent = new Student() { Student_ID = "0000020001", Student_Name = "猪猪打屁股", Student_Sex = "男", Student_Identity_Card = "610102198307122319", Student_Birthday = DateTime.Now, Student_Email = "menglin2010@126.com", Student_Class = "741903613@qq.com", Create_Time = DateTime.Now }; //1、Detached--实体跟context压根没关系 { using (SchoolDBEntities dbContext = new SchoolDBEntities()) { Console.WriteLine(dbContext.Entry<Student>(newStudent).State);//实体跟context没关系 Detached newStudent.Student_Name = "小鱼儿"; Console.WriteLine(dbContext.Entry<Student>(newStudent).State);//Detached dbContext.SaveChanges();//Detached啥事儿不发生 } }
2、Added--添加
我们看到刚开始,newStudent这个学生和上下文是Detached分离状态,当把newStudent添加到上下文的Students集合里后,再打印newStudent的状态,newStudent就是Added状态了,当执行dbContext.SaveChange()后,把这个学生添加到表里,最后打印newStudent的状态,发现是Unchanged状态,Unchanged的意思是上下文和newStudent建立了跟踪,但是newStudent没有发生改变
//2、Added--添加 { using (SchoolDBEntities dbContext = new SchoolDBEntities()) { Console.WriteLine(dbContext.Entry<Student>(newStudent).State);//Detached dbContext.Students.Add(newStudent);//插入数据(自增主键在插入成功后,会自动赋值过去) Console.WriteLine(dbContext.Entry<Student>(newStudent).State);//Added dbContext.SaveChanges(); Console.WriteLine(dbContext.Entry<Student>(newStudent).State);//Unchanged(跟踪,但是没变化) } }
3、Unchanged--跟踪,但是没变化
Unchanged就是上下文和实体建立了跟踪,但是实体的值没有发生改变
4、Modified--内存Clone
把上次添加的那个“猪猪打屁股”的学生查出来,打印实体状态是Unchanged表示上下文建立了跟踪,但是实体未改变,然后修改学生姓名为“猪大头”,再打印实体状态是Modified,表示实体已发生了修改,当执行dbContext.SaveChange()后,把对这个学生的修改保存到表里,最后再打印newStudent的状态,发现是Unchanged状态,表示上下文和实体建立了跟踪,但是实体的值没有发生改变
{ using (SchoolDBEntities dbContext = new SchoolDBEntities()) { Student currentStudent = dbContext.Students.Find("0000020001");//即时查询 Console.WriteLine(dbContext.Entry<Student>(currentStudent).State);//Unchanged(跟踪,但是没变化) currentStudent.Student_Name = "猪大头";//修改--内存clone Console.WriteLine(dbContext.Entry<Student>(currentStudent).State);//Modified dbContext.SaveChanges();//更新数据库,因为状态是Modified Console.WriteLine(dbContext.Entry<Student>(currentStudent).State);//Unchanged(跟踪,但是没变化) }}
5、Deleted--删除
把上次修改的那个“猪大头”的学生查出来,打印其实体状态是Unchanged表示上下文建立了跟踪,但是实体未改变,然后从上下文的Students集合中移除,再打印实体状态是Deleted,表示实体已删除,当执行dbContext.SaveChange()后,把这个学生从表里删除掉,最后再打印newStudent的状态,发现是Detached状态,表示上下文和实体已经分离,和上下文没有任何关系了
{ using (SchoolDBEntities dbContext = new SchoolDBEntities()) { Student currentStudent = dbContext.Students.Find("0000020001");//即时查询 Console.WriteLine(dbContext.Entry<Student>(currentStudent).State);//Unchanged(跟踪,但是没变化) dbContext.Students.Remove(currentStudent); Console.WriteLine(dbContext.Entry<Student>(currentStudent).State);//Deleted dbContext.SaveChanges();//删除数据,因为状态是Deleted Console.WriteLine(dbContext.Entry<Student>(currentStudent).State);//Detached已经从内存移除了 } }
来源:https://www.cnblogs.com/menglin2010/p/12240027.html