O/RM框架,EF6全面解析
目录
- 基础:O/RM对象关系映射
- 基础:EF的三种映射方式
- 基础:复杂查询&执行Sql
- 进阶:EF状态跟踪,EF查询缓存,EF查询优化性能,按需更新
- 进阶:EF上下文生命周期/事务
- 进阶:EF延迟加载本质,导航属性
- EF框架搭建:项目分层架构
- EF框架搭建:EF整合分层架构
- EF框架搭建:EF整合IOC unity、AOP封装扩展
- 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(推荐使用):数据库已经存在,还是代码先行,数据存在就不用生成数据库;
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是操作内存中的数据
本文来自博客园,作者:12不懂3,转载请注明原文链接:https://www.cnblogs.com/LZXX/p/13372567.html