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

时间: 2024-11-08 19:26:45

EntityFramework优缺点(转)的相关文章

EntityFramework优缺点

EntityFramework优缺点 Entity Framework  是微软推荐出.NET平台ORM开发组件, 现在已放源代码.  以下我们来讨论一下优缺点和一些问题, 以下简称EF.  有兴趣可查询官网的Entity Framework 6 RoadMap. 高层视图: 改变在现有系统使用EntityFramework的优势是什么? • All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的. • 可维护性,易于理解的代码,无需创造大的数据访问层. • 提供LINQ查询数据

基于EntityFramework的权限的配置和验证

1.   概要 本文主要介绍公司现有系统框架的权限体系,和一些待扩展功能的说明.目前该权限体系基于角色构建(RBAC),原则上,系统中不允许出现对用户.组织等其他对象指派权限的情况. 2.   权限分类 目前系统中的所有表现形式的权限可以归为两类: 一类是描述对象或动作是否可见,我们称之为功能权限(Authority).例如,菜单的可见性.用户添加按钮是否可见.用户添加方法是否可用等: 另一类是描述可见对象的范围或动作的影响范围,我们称之为数据权限(Permission).例如,未成年用户列表.

Entity Framework优缺点及使用方法总结

Entity Framework优缺点及使用方法总结 Entity Framework是微软提供的一个ORM框架,它旨在为小型应用程序中数据层的快速开发提供便利. nuget上185W多的下载量,说明.Net开发人员还是比较喜欢用EF的.但是EF在提供了便利性的同时也有许多缺点,以下就是我认为不应该应用EF的场景: 非SQL Server数据库且无该数据库的DataProvider 高性能要求.在进行一些复杂查询的情况下,EF的性能表现不太好,而开发人员又无法控制SQL语句的生成 高安全性要求.

EntityFramework Model有外键时,Json提示循环引用 解决方法

正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮躁了,很少有能深入研究下去并将自己经验分享的人,可能很忙,也可能嫌麻烦.特别是面向新技术,尤其是在学习资料有限的情况下,愿意花费时间摸索和分享的人实在太少太少,遇到问题,搜索结果一抓一大把,但是往往都是转载,连最起码的自己验证都没有,结果就是以讹传讹,不仅对解决问题无用,反而容易产生误导.最近这段时

云计算背后的秘密:NoSQL诞生的原因和优缺点

转载收藏一篇对nosql讲解的比较全面的文章:http://blog.csdn.net/xlgen157387/article/details/47908797 这篇文章将和大家聊聊为什么NoSQL会在关系型数据库已经非常普及的情况下异军突起? 诞生的原因 随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度; 2. 支撑海量的数据和流量:对于搜索这样大型应用而

mongodb的优缺点

在这里收集下我自己对Mongodb的一些优缺点方面的认识,或者是通过其它比较可靠的网文上引用或者摘录的作为依据,这个是一个渐进的过程,也是随着我对Mongodb认识的加深而不断扩展的. (1)Mongodb的不足之处 1.在集群分片中的数据分布不均匀 2.单机可靠性比较差 3.大数据量持续插入,写入性能有较大波动 4.磁盘空间占用比较大 (2)Mongodb的过人之处 1.无模式 2.查询与索引方式灵活,是最像SQL的Nosql 2.支持复制集.主备.互为主备.自动分片等特性

EntityFramework 4使用存储过程分页

1 CREATE PROC usp_OrgPage_SQL 2 @pageIndex INT, 3 @pageSize INT, 4 @totalCount INT OUTPUT 5 AS 6 BEGIN 7 SET @totalCount = (SELECT COUNT(*) FROM dbo.Organization) 8 SELECT * FROM 9 ( 10 SELECT *,ROW_NUMBER() OVER(ORDER BY OrganizationID DESC)AS row F

android Asynctask的优缺点?能否同时并发100+asynctask呢?

一  Asynctask的优缺点? AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 优点: 1.简单,快捷 2.过程可控 3.使用的缺点: 缺点: 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handle

C/S和B/S两种架构区别与优缺点分析

C/S和B/S,是再普通不过的两种软件架构方式,都可以进行同样的业务处理,甚至也可以用相同的方式实现共同的逻辑.既然如此,为何还要区分彼此呢?那我们就来看看二者的区别和联系. 一.C/S 架构 1. 概念 C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据:另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序