一:背景

说到EF的性能问题,我相信都是大家比较头痛的问题,有很多初学者望而却步,可是每每菜鸟在群里面抱怨EF太慢的时候,这个时候总有一些大牛登场说一句:怪EF咯?怪你不会用! 当然我从未嫌弃过它,因为我没有做过高性能的项目。前几天看 Nop项目的时候对Attach 和Detach这两个方法很好奇,一经细究如发现珍宝一般:性能优化的捷径。

二:概念

将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中,从解释可以看出Attach方法主要目的就是把一个没有被dbContext跟踪的对象附加到dbCotext中使其被dbContext跟踪

三:以前我是这样写的

    我都是以修改为例子

我们来分析一下这几行代码,首先它根据Id(测试数据为:int 1)获取出实体(ef模式是对其进行跟踪的),修改后执行SaveChanges 方法,将追踪的实体修改生成 一条sql 语句抛给数据库去执行。那么这个过程中我们总共对数据库进行了两次操作。

而我们平时用纯sql 语句来对数据库进行操作的时候,只需要一次操作即可,虽然ef 已经够强大了,可是它还是很难做到能够赶上原生sql 的效率的两倍。而且ef 最终还是基于sql ,我们只能把效率往 原生Ado.net方向靠近---把不必要的操作去掉,即去掉第一步的取出数据的步骤。

四:现在我是这样写的

首先我们来分析一下上面的代码: u 变量就是从外部传过来的,首先我们让ef 追踪此对象(Attach),然后对此对象状态进行修改,这里是赋值为:Modified ,最终SaveChanges执行将生成一条根据ID 生成一条update sql 语句抛给数据库执行。

当然这里给你提供了很多扩展:

你可以进行添加,删除,取消追踪等操作。

EF性能优化(一)的更多相关文章

  1. [转]ASP.NET MVC3 + EF 性能优化解决方案以及最优架构

    [集思广议]      我们用 asp.net mvc3 + ef 做了一个网站,现在是内测阶段,发现打开速度非常慢.首页打开(无缓存)都在5-6s以上(测试环境:程序和db都在本机),请问各位 mv ...

  2. EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET

    十年河东,十年河西,莫欺少年穷. EF就如同那个少年,ADO.NET则是一位壮年.毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET. 也就是说:你所写的LINQ查询,最后还是要转 ...

  3. EF性能优化

    下面总结了一些在使用EF的过程中应当特别注意的地方,避免大家再走弯路. 1.分清真分页和假分页 大家都知道分页分为真分页和假分页,并且假分页是特别耗费性能的.我们在使用的过程中也是以真分页为主,但是在 ...

  4. EF性能优化篇一

    https://www.cnblogs.com/chenwolong/p/7531955.html 1.合理使用AsNoTracking 若对查询的数据不需要做任何修改,则可采用AsNoTrackin ...

  5. C#中 EF 性能优化

    https://www.cnblogs.com/chenwolong/p/7531955.html EF使用AsNoTracking(),无跟踪查询技术(查询出来的数据不可以修改,如果你做了修改,你会 ...

  6. C#实用杂记-EF全性能优化技巧

    原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG   ...

  7. 浅析Entity FrameWork性能优化

    浅析EF性能优化 1.       数据Load 延迟加载:当实体第一次读取时,相关数据没有加载:当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显 ...

  8. 一次EF批量插入多表数据的性能优化经历

    距离上次的博客已经有15个多月了,感慨有些事情还是需要坚持,一旦停下来很有可能就会停很久或者从此再也不会坚持.但我个人一直还坚持认为属于技术狂热份子,且喜欢精益求精的那种.最近遇到两个和数据迁移相关的 ...

  9. EntityFramework之异步、事务及性能优化(九)

    前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...

随机推荐

  1. Socket异步通信学习三

    接下来是客户端部分,采用同步接收模式,在SocketClient项目中新建了一个SynServer类,用于存放socket服务器代码,和AsynServer类似,主要有4个方法: 有一个全局socke ...

  2. Google实习面试归来

    咱们寝室共有两个人收到面试通知,我和另一哥们G.      今天早上8:30起了个大早,洗漱完毕,简历复印完毕,就和G骑车到达了世贸中   心酒店那儿.真不愧是世贸中心啊,装修就是华丽,连看门的都是印 ...

  3. Disruptor框架

    http://developer.51cto.com/art/201306/399370.htm

  4. 修改整个app的字体

    在项目开发中  有时候为了一些好的UI效果  可能需要自定义字体  app导入字体库的教程网上有很多 导进去 修改plist文件  然后如何将整个app的字体都换成自定义的字体呢  一个个去写太麻烦了 ...

  5. PHP输入流php://input介绍

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组.所以,这里主要探讨php输入流php://input 对一php://inpu ...

  6. mysql 5.5 win7安装最后一步总是停止响应

    今天刚开始安装了64位版本的mysql5.5 ,安装很顺利,后来发现库不兼容的问题,于是卸载,安装mysql-5.5.27-win32的32位版本,奇怪了,怎么安装,怎么卸载都不行,就是到最 后一步停 ...

  7. Spark1.2新特性概述

    http://mp.weixin.qq.com/s?__biz=MjM5NTc2MTg3Mw==&mid=201641685&idx=1&sn=1b75be3d774bb3f2 ...

  8. 20160531-20160607springmvc入门

    springmvc的基础知识 什么是springmvc? springmvc框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc入门程序 目的:对前端控制器.处理器 ...

  9. .net 文件操作

    一.DotNet文件目录常用操作: DiveInfo:提供了对逻辑磁盘的基本信息访问的途径.(只能查看信息,不能做任何修改.) System.Environment:用来枚举驱动器.(不能获取驱动器的 ...

  10. C# 调试程序弹出 没有可用于当前位置的源代码 对话框

    解决方案: 1.右键点击解决方案->属性->通用属性->调试源文件. 2.看看你的程序有没有被增加到“不查找这些源文件”这个框里. 3.如果有删除,然后重新编译即可调试,解决问题.