EntityFramework 性能优化
无状态跟踪:
//当只需要返回一个只读的数据的时候,并不会对数据记录进行任何的修改。
//这种时候不希望Entity Framework进行不必要的状态变动跟踪(提升性能)
//使用Entity Framework的AsNoTracking方法来查询返回不带变动跟踪的查询结果。
//由于无变动跟踪,所以对返回的数据的没有进行任何修改,在SaveChanges()时,都不会提交到数据库中。
var stu = studentEntities.StudentList.Select(s => s).Where(s => s.Name == "liFlower").AsNoTracking().FirstOrDefault();
Console.WriteLine(stu.ID + " " + stu.Name);
Console.WriteLine(studentEntities.Entry(stu).State.ToString());//对象存在没有被跟踪
//result:Detached
或者
//禁用自动跟踪(适合大批量的数据操作)
studentEntities.Configuration.AutoDetectChangesEnabled = false;
显示的告知应进行的变化(否则CLR回去一个一个对比,降低性能!)
添加:
studentEntities.Entry<StudentList>(student).State = EntityState.Added;//显示的告知变化
//等同于:studentENtities.studentList.add(student);
studentEntities.SaveChanges();//提交添加!
修改:
//直接修改要添加的对象的数据
//然后显示的告知变化
studentEntities.Entry<StudentList>(student).State = EntityState.Modified;
studentEntities.SaveChanges();//提交添加!
//创建一个替身对象(无需像以前一样查询)
var deleteStu = new StudentList()
{
ID = 1630200001 //根据主键删除
};
studentEntities.Set<StudentList>().Attach(deleteStu);//将实体以未更改的状态添加到上下文中 :删除时必须有
studentEntities.Entry<StudentList>(deleteStu).State = EntityState.Deleted;
Console.WriteLine(studentEntities.SaveChanges());
利用缓存查询
studentEntities.studentList.Count();//第一次查询~生成了缓存
studentEntities.studentList.Local.Count();//第二次查询就可以直接使用缓存