ADO.NET Entity Framework (实体模型框架) 一些使用的注意事项

来源:互联网 发布:叶卡捷琳娜二世 知乎 编辑:程序博客网 时间:2024/06/07 11:16

本文主要针对初学者,针对ADO.NET EntityFramework性能差的评价也不绝于耳,其实有很多是滥用所致。最后一小节列出了注意事项(特别针对WEB开发)

 

EntityFramework简介

微软对于ORM的理解不断演进,经过RecordSet-> DataTable(DataSet)-> 强类型DataSet->Linq2SQL-> EntityFramework的演进,目前微软主推的ORM框架
是一套数据库访问框架,构建于ADO.NET之上
是一套实体模型框架,自动完成实体与数据库的映射
善于做数据查询操作,不善于批量更新数据
提供接口,第三方数据库厂商可以直接使EF支持自己的产品
支持的数据库包括:SQLServer/Oracle/MySQL/DB2*等…

 

EnityFramework的使用

创建

添加ADO.NET EntityFramework模型对象
1:通过已有数据库生成实体模型
2:或使用VS设计器设计模型,再从模型创建数据库
概念
ObjectContext: Connection,对象缓存,状态管理器 的集合
EntityObject: 实体类,某种程度上对应数据库中的Table或View
存储过程/方法 可映射到ObjectContext的方法上
 

概念

复杂类型:如果存储过程或者某些查询返回的结果不对应数据库中的表或者View或者现成的实体模型,可以建立复杂类型,作为返回值
关系:数据库中的外键将映射到EF中的关系(1:1, 1:n)
状态管理器:维持一个ObjectContext中实体类的状态(如需要添加或删除,或某些字段被修改过,需要提交到数据库等)
Linq(读:Link)一种类SQL语法,用于在程序代码中执行查询操作。特点是select后置。使得查询语句可以经过编译,避免低级错误发生。
表达式树:Linq查询语句生成的是一个表达式树(类似SQL语句)而非数据本身,当第一次实际访问其中的数据时,才会提交到数据库做实际查询。
 

EntityFramework使用的注意事项

若无特殊需要,不要缓存/公用 ObjectContext对象
对于查询结果(集),请先为变量赋值,后通过变量访问
 不要多次对表达式取.ToArry()/.FristOrDefault()等*
 对表达式树请求数据,以最小请求次数为原则
假设要返回结果集,并返回总条数。对表达式树.Count()和.ToArray().Count()的执行原理是不同的,前者对数据库求Count,后者对数据库返回所有数据后求Count
假设判断存在数据与否,存在的话取第一条;先求Count()/Any()再Frist(),不如直接FristOrDefault()
假设判断是否有数据,Count()和Any()的效率也是有区别的,Any()效率更高一些(相当于if exist)
 
不同ObjectContext查询出来的实体类是不能交叉更新的,需要Detach/Attach操作后,方可更新。
不要忘记使用事务!TransactionScope
请批量提交,不要修改一个值就SaveChanges()一次
特别避免如下场景:
客户端/领域模型传回一个经过修改的实体类,取出主键做一次查询,将传回的对象的属性为查询出的对象赋值,提交更改。
正确的方法为Attach后再做更新。(可以网上找一些相关文章或类库)
 
 
针对需要通过网络传输(特别是通过序列化)查询结果集的时候,需要特别慎重使用外键。
复杂的外键关系将导致对象被序列化后臃肿不堪,难以传输,造成性能问题,造成传输常常失败。
应该将数据在传输阶段的外键关系打断,分别传输各个表/领域模型的数据。接收端收集数据完全后,再重新组织。
 
原创粉丝点击