1. 什么是EF
微软提供的ORM工具. ORM让开发人员节省数据库访问代码的时间. 将更多的时间放在业务逻辑层面上. 开发人员使用linq语言, 对数据库进行操作.
2. EF的使用场景
EF有三种使用场景: 1.从数据库生成class.(即所谓的DB first) 2. 由实体类生成数据库表结构.(code first) 3. 通过数据库可视化设计器涉及数据库, 同时生成实体类.(model first)
如果对于没有使用过EF的人来说这种含糊其辞的概念很难以理解.其实就是一个先后关系, 先有数据表结构还是先有对应的实体类的问题.
3. Entity Framework 特性:
理解EF的各项特性将成为是否真正懂得使用EF的关键.以及判断一个人使用EF的深入程度.
- 跨平台性, cross-plantform: EF core是一个跨平台的框架. 可以在windows, linux, 和mac系统上运行.
- 模块性, modelling: EF创建一个EF model, 对相关联的数据库是以模块级别的数据进行存储和获取.
- 可查询, 可以使用linq查询语句获取数据.数据库会将linq的查询语句转化成db指定的查询语言.
- 可跟踪变更: EF会跟踪需要提交到数据库的实体实例(属性值)发生的更改.
- 可保存: 当调用SaveChanges()方法时,EF会根据实体发生的更改对数据库执行INSERT,UPDATE和DELETE命令。 EF还提供异步SaveChangesAsync()方法.
- Concurrency 并发: EF默认使用Optimistic Concurrency(开放式并发)来保护覆盖其他用户所做的更改,因为数据是从数据库中提取的.
- Transactions 事务: EF在查询或保存数据时执行自动事务管理(自动事务管理)。 它还提供自定义事务管理的选项.
- Caching 缓存机制: EF包括开箱即用的第一级缓存。 因此,重复查询将从缓存中返回数据,而不是访问数据库.
- Built-in Conventions 内置约定: EF遵循配置编程模式的约定,并包括一组自动配置EF模型的默认规则.
- Configurations 可配置: EF允许我们使用数据注释属性或Fluent API来配置EF模型以覆盖默认约定.
- Migrations 支持迁移: EF提供了一组可在NuGet包管理器控制台或命令行界面上执行的迁移命令,以创建或管理底层数据库模式.
4. EF如何进行工作.
EF的api可以在实体类和DB之间建立一个映射关系. 并且使用linq语句对Entity进行造作, 并且最终save change.
EF api将linq-entities 查询语句转义为sql 查询语句, 将数据库中的Entity data model查询出来后转化成Entity
5. EF对数据库操作性能优化途径
这里只是简单列举一些可以优化查询的手段
- 如果查询中包含多表查询, linq在拼写时, 可以添加include使用连接查询,例如 db.scores.take(100).include(t => t.studen).tolist()
- 如果对于查询的结果只使用部分字段, 那么没有必要将所有数据都查出来放入内存, 影响内存的空间以及程序与数据库传输带宽.例如: var scores = db.scores.take(100).include(t => t.student).select(t => new {t.chinese, t.createdtime, studentName = t.student.name}).tolist()
- 循环中慎用查询
- asNonUnicode && asNoTracking 字面意思是无跟踪查询, 查询出来的对象不能更改. 如果对数据集合仅仅是用作显示, 不需要修改并更新到数据库的时候, 可以使用.
- ANY.
6. EF对于代码优化途径
6.1 在查询数据库返回结果集的时候经常会对结果集进行排序操作. 实际的项目中往往也会根据前端传递过来的字段以及排序参数来拼写查询语句进行查询. 但是当前端字段数量比较多的时候, 代码怎么写比较优雅呢.
正常来说会用一个switch来根据不同的情况去拼写query语句中的orderby. 但是当case无限多的时候, 我们可以使用system.linq.dynamic, 编写orderby的扩展方法.
6.2 一篇比较好的关于EF性能优化的文章:
https://www.cnblogs.com/hantianwei/archive/2013/04/26/3044157.html
感谢阅读.如有问题随时可联系: Dennis