EntityFramework优缺点(转)
Entity Framework 是微软推荐出.NET平台ORM开发组件, 现在已放源代码. 以下我们来讨论一下优缺点和一些问题, 以下简称EF. 有兴趣可查询官网的Entity Framework 6 RoadMap.

高层视图:
改变在现有系统使用EntityFramework的优势是什么?
• All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的。
• 可维护性,易于理解的代码,无需创造大的数据访问层。
• 提供LINQ查询数据库,这需要从初级开发人员不太了解SQL。
• EF可以用作用于数据服务和OData Service的基础设施。
什么的情况下,不建议使用EF呢?
• 实时的应用程序。
• 只能通过存储过程访问数据库。 EF的优势是:跟踪实体状态Change时,不仅仅在存储过程上.(即使EF确实对存储过程支持有限的)。
• 频繁插入操作(Insert), 并且EF不支持大数据Bulk 插入。
• 频繁更新操作,更新的目标主要是当多行(用一个单值)
例如:UPDATE 表名 SET ColumA = 10 Where ColumnB =?
这种更新操作更好的使用的ExecuteNonQuery(也可从Context上下文或直接从Ado.Net)。
• 反范式的表设计和高性能查询。 EF产生查询,他们是难以维护的,它并不能很好地支持映射到不规范的表。
• 对程序有非常的性能要求, 需要对每个查询进行监控.
我们要在加载所有数据到内存中,建议使用实体框架? 我们应该期待什么样的问题呢?
• 加载的所有实体将需要许多查询和大量的时间。
• 内存开销。
• 会有延迟,因为EF需要跟踪实体的变化的和大Collection对象的处理。
• EF的Context上下文不是线程安全的,你不应该在整个Service上使用一个Context上下文。
• 如果你打算这样做,使用EF加载实体,但并不管理它们. (Detach the entities从context)。
• 不使用的上下文Context对象作为一个缓存对象(用于分布式的情况下). 它不是线程安全的,有一些开支和不遵循分散关注(Separation of Concern)的设计。 更好的办法是设计缓存API,如AppFabric缓存。
技术层面:
内存泄漏:
我们有这样一个场景,每10秒我们打开Context上下文获取一个单表,并关闭它。 “using (entities context = new entities(_connection)) {… ”
经过一段几个小时,这引起了内存泄漏。
• 我建议你检查内存泄漏,以确保它是从EF是根源。 EF是一个开源的,所以现在可以报告任何内存泄漏并修正它。
• 使用Profiler的VMMap,以便跟踪泄漏的源头。
在这种情况下,我们应该保持Context一直打开?
• 这其实并不重要,因为查询仍然会执行。 然而,这是最好关闭Context下,所以缓存的实体将垃圾回收,否则Context和缓存的实体将在GC中升级到第二代,并且会被困在那里的持续一段时间。
• 不要为WCF每个请求创建一个Context上下文对象。
• 推荐的做法是为每次操作创建的Context对象,因为实体Item一旦被被添加到数据库后就已经过时了,可能会导致数据损坏或重复的Item
EDMX的大小有影响吗?
• EDMX影响的大小,因为所有的EDMX数据加载到内存中创建Context上下文。
• EDMX被加载到内存中,解析与映射在AppDomain中创建和缓存。 您可以关闭并重新打开Context,它没有影响已缓存EDMX映射。
非常多的表
如果所有的表放在单个的EDMX或分别存放于几个EDMX文件之间?
如何能管理的EDMX中大量的实体? 例如,如何可以找到它们?
在设计器中修改一个特定的表?
• 如果拆分之间edmx文件,你可以不连接实体的导航性能。
你应该建立自己的模型,根据您的实体模型设计 - 如果你有一组是独立的实体,他们可以在不同的EDMX模型。
EDMX文件处理数百个实体类型。 如果实体类型的数量超过1000家,我会考虑到的几个Edmxs(分开和重新审视自己的实体模型设计,因为成千上万的实体类型的一个系统似乎太多)。
• 在VS 2012,以设计器的增强分解功能和着色等,请参阅以下链接。
• EF设计器有一些改进,如着色区分实体组的实体。
也有第三方实体的设计器,可能会得到更好的用户体验。
请记住 - EF是一个开源的,你可以给他们的要求,甚至贡献自己的增加,所以在EDMX设计器探索很有趣的。
• 你应该按每个域/服务来拆分edmx文件到不同EDMX文件。
表之间关系
Lazy与No Lazy模式?
• 在分布式情况下Lazy代码是魔鬼。
• 如果他们需要一组表中的数据,然后使用Include,否则,你可以使用Lazy Load模式
“Include”命令加载整个表或ObjectSet原始记录?
• Include加载是相关实体的列。 EF不使用 * 查询.
如何使用EF执行批量插入/更新操作?
• 做不到这一点,你需要使用原始的SQL语句来实现。
当一个实体被标记为已修改,EF更新的所有列?
• 它不更新所有的列,除非你正在使用分布式的应用程序与Self-Tracking。 “正常”实现下EF只更新修改列。 Self-Tracking不跟踪的已更新的属性,它标志着的所有属性已更新。 您可以编辑Self-Tracking,并修复它,如果需要的话。
• 您可以附加一个SP以实现自定义的逻辑。
• 您可以更改T4模板的文件,在Self-Tracking下以保持所有原始值。
整个RAW更新的开销大么?
• 大多数DB重新计算索引。 这是一个问题关系到DBA。
当我们使用EF为700-800KB的XML文件来更新XML列,我们收到了有关SQL Server的tempdb一个异常。 什么造成的吗?
• 可能涉及到数据库如何用临时表来更新XML的内容。
应该和DBA检查你的数据库,你也许需要增加您的tempdb数据库的大小。
• 在一般情况下, 大的对象,如XML使在GC的Large Object Heap内存的压力,你应该考虑迁移到.NET 4.5版本的GC大型对象堆碎片整理特性。
• 你可以考虑来存储XML为byte [],它可以被压缩(XML不是一种非常经济的格式)。
使用EF与ADO.Net的开销?
• DataReader的结果变换到对象的开销,从LINQ编译SQL查询的开销。
您将有相同的开销,甚至更多,如果您尝试建立你自己的ORM框架。 不这样做!
• 抽象层的开销, 它取决于他们用EF所做的事情。
• 一般而言,您应该组合替代继承,避免它有一个更大的开销。
您可能感兴趣的文章:
使用LINQPad调试Linq和Entity Framework
希望对您软件开发有帮助.
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
EntityFramework优缺点(转)的更多相关文章
- EntityFramework优缺点
高层视图: 改变在现有系统使用EntityFramework的优势是什么? • All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的. • 可维护性,易于理解的代码,无需创造大的数据 ...
- 流行ORM产品优缺点分析--EntityFramework、NHibernate、PetaPoco
什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...
- 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活
写在前面 我到底是什么? 越界的可怕 做好自己 后记 上一篇<恋爱虽易,相处不易:当EntityFramework爱上AutoMapper>文章的最后提到,虽然AutoMapper为了En ...
- 基于EntityFramework的权限的配置和验证
1. 概要 本文主要介绍公司现有系统框架的权限体系,和一些待扩展功能的说明.目前该权限体系基于角色构建(RBAC),原则上,系统中不允许出现对用户.组织等其他对象指派权限的情况. 2. 权限分 ...
- Entityframework Code First 系列之项目搭建
Entityframework(以下简称EF)是微软推出的一个ORM(Object Relational Mapping)框架. 优缺点 优点: 易上手,语法简单,查询容易 更新快,不断补足 缺点: ...
- DTO学习系列之AutoMapper(六)----EntityFramework和AutoMapper的婚后生活
写在前面 我到底是什么? 越界的可怕 做好自己 后记 文章标题主要关键字:mapping DTOs to Entities,注意并不是“Entities to DTOs”,表示实体对象到DTO的转换, ...
- EntityFramework Model有外键时,Json提示循环引用 解决方法
正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- ORM框架之EntityFramework介绍
ORM框架之EntityFramework介绍 1. 简介 大家好!我是高堂. 作为一位伪前端程序猿,我给大家介绍一下微软的自家的 ORM框架. ADO.NET Entity Framework 以下 ...
随机推荐
- 关于在 mac上配置pytesseract的相关问题
因为踩了两个小时坑 特别是在配置依赖tesseract-ORC识别库时候的问题 特别麻烦 一定要用brewhome 一定要用brewhome 一定要用brewhome 重要的事情说三遍. 刚开始我在网 ...
- JXSE and Equinox Tutorial, Part 2
http://java.dzone.com/articles/jxse-and-equinox-tutorial-part-0 ———————————————————————————————————— ...
- HTML5边玩边学(1)画布实现方法
一.<canvas>标签 Html5 引入了一个新的 <canvas> 标签,这个标签所代表的区域就好象一块画布,你的所有图形绘制最后都要在这块画布上呈现.有了这个标签,浏览器 ...
- 1001Sum Problem
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): ...
- 用keyword实现Editor.GetSelection的退出功能
有时候我们在使用 GetSelection 功能让用户选择实体时,可能会给用户提供一些 keyword 选项,要接收用户选择的 keyword 选项,需要用到 PromptSelectionOptio ...
- ZOJ 3596Digit Number(BFS+DP)
一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...
- Lucene/ElasticSearch 学习系列 (1) 为什么学,学什么,怎么学
为什么学 <What I wish I knew When I was 20>这本书给了我很多启发.作者在书中提到,Stanford 大学培养人才的目标是 ”T形人才“:精通某个领域,但对 ...
- ActionBarCompat
布局文件中添加menu menu_main.xml <?xml version="1.0" encoding="utf-8"?> <menu ...
- UVA1151
//感觉刘汝佳老师的思维真的太厉害了orz /*摘录书上的一段话: 只需一个小小的优化即可降低时间复杂度:先求一次原图(不购买任何套餐)的最小生 成树,得到n-1条边,然后每次枚举完套餐后只考虑套餐中 ...
- IE下实现类似CSS3 text-shadow文字阴影的几种方法
IE下实现类似CSS3 text-shadow文字阴影的几种方法 一.开始的擦边话 为了测试IE9浏览器,下午晃晃荡荡把系统换成window7的了.果然,正如网上所传言的一样,IE9浏览器确实不支持C ...