O/RM框架,EF6全面解析

目录

  1. 基础:O/RM对象关系映射
  2. 基础:EF的三种映射方式
  3. 基础:复杂查询&执行Sql
  4. 进阶:EF状态跟踪,EF查询缓存,EF查询优化性能,按需更新
  5. 进阶:EF上下文生命周期/事务
  6. 进阶:EF延迟加载本质,导航属性
  7. EF框架搭建:项目分层架构
  8. EF框架搭建:EF整合分层架构
  9. EF框架搭建:EF整合IOC unityAOP封装扩展
  10. EF框架搭建:EF封装扩展

EntityFramework教程:http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html#_Toc228672754

EF6存储过程:https://www.cnblogs.com/panchunting/p/entity-framework-code-first-stored-procedures.html

EF6:数据库迁移:https://www.cnblogs.com/panchunting/p/entity-framework-code-first-migrations.html

EF6:主外键关系:https://www.cnblogs.com/liangxiaofeng/p/5809451.html

EF复杂查询:http://www.cnblogs.com/ingstyle/p/5711403.html

Linq to SQL 语法查询(子查询 & in操作 & join ).pdf:https://www.cnblogs.com/ingstyle/p/5711403.html

1.基础:O/RM对象关系映射

原来的ado.net:开发效率低 但是性能是最好的

 

使用ORM:开发简单,性能有一定劣势

 

 

 

 

 

2.基础:EF的三种映射方式

#DBFirst:数据库先行,就是先把数据库创建好,再在代码里面使用EF链接到数据库生成实体类  具体的文件名叫.edmx 而里面的.tt文件 就是数据库表的架构 

#CodeFirstFromDB(推荐使用):数据库已经存在,还是代码先行,数据存在就不用生成数据库;

#CodeFirst:代码先行,直接写业务逻辑,通过业务逻辑实体去生成数据库;
 

3基础.EF状态跟踪,EF查询缓存,EF查询优化性能,按需更新

 1.如果我们想要用EF操作实体,那么是怎么让EF和实体之间联系起来的? 其实是每次需要把实体注入到ef之中

 2.为什么会说EF会有性能问题?,实际上我们用EF操作实体的时候 因为有状态跟踪,每次状态的变化其实是-clone副本放到内存里面去 所以可以使用AS-Notracking 不让查出来的结果被上下文跟踪,这样也就不占内存,但也要考虑到这个实体是否后续会被用到

 3.EF查询实际上是优先从缓存查找,只有ef.Tolist ef.ToArray 才会把结果加载到内存,后面再用EF去Find查找就直接去缓存查,没有就直接去数据库查-所以也就建议多实用EF.Find查询,以为优先走的是缓存,而且还是走主键查询

 

4基础.EF状态跟踪-复杂查询

#复杂查询:http://www.cnblogs.com/ingstyle/p/5711403.html

#ef6:如何查看执行的sql语句

 

 

#EF调用Attach的附加对象的时候,如果让context 给一些表对象+=值的时候,必须保证数据的主键和数据库一致

#EF的SaveChange提交,就会把在contenxt中所有的操作都提交到数据库

#SaveChange就是以Context为维度的

#EF里面的Context和对象有以下几种状态=就是EF的状态跟踪

 

 

 

#性能问题:只要被Contenxt跟踪,就会在内存中克隆一个对象,每一次修改都会和内存中克隆对象比对,比对之后的结果就是新状态

#性能解决:所以一般EF做查询的时候如果对象不需要修改,那么可以使用AsNoTracking()方法取消状态跟踪提高性能,这样就不会再内存中克隆对象

 

 #按需更新

 

 

 

5.进阶: Context生命周期解析

#Context生命周期

  1.EF提交SaceChange会默认启动事务,然后提交给Data操作

  2.Context是一个上下文环境,里面内置对象跟踪,会开启一个连接(等同于一个数据库连接),一次请求最好是一个Context

  3.多线程情况下的Context最好是每个线程一个Context,用完且需尽快释放内存,如果多线程共用一个Context 那么会造成A插入还不想提交的时候 B进行修改提交 会造成两人都提交到数据库中去

 #EF事务事务多种事务 

  1.一般是SaveChange,如果使用了Commit那么会以Commit为准

 EF分布式事务下可以使用TencentClassRommContext保证多个数据库的事务提交 TranSactionSope事务

6.EF延迟加载解析,导航属性

 EF是怎么实现延迟加载的?

 1.EF继承自Iqueryable(结构) 下面有 Expression:表达式目录树,能够生成SQL语句的数据结构 Provider:把表达式目绿树生成SQL语句的程序 ElementType:查询DataBase返回结果

 2.所以EF延迟加载先用Expression生成对象SQL数据结构 在使用的时候再去用Provider生成SQL脚本 使用ElementType方法到数据库中查询

 3.而且延迟加载必须作用在Context作用域内 因为Context就是一个与DataBase的连接 如果没在里面 没有DataBase连接 那就没有作用了

4.查询的时候如果不想要延迟查询,直接加.ToList,,.Count()

#EF查询出来的值 转换为.AsQueryable:根据条件拼接

#Linq To Object也可以延迟加载但是确实不一样的

 1.它继承自Ienumerator是一个迭代器 下面有 Current MoeNext Reset 是从内存中在需要查询的时候循环迭代返回结果的

 

#.AsQueryable和AsEnumerable对比 所以IEnumerable是操作内存中的数据

 

 

 

posted @ 2020-08-05 10:35  12不懂3  阅读(970)  评论(0编辑  收藏  举报
创作不易,请勿抄袭,欢迎转载!