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();//第二次查询就可以直接使用缓存


posted @ 2020-10-22 15:28  李花花小番茄  阅读(146)  评论(0编辑  收藏  举报