你真的了解EF吗?关于EntityFramework的高级优化
接上一篇文章。现在写程序,做项目不是说功能做完就完事了,在平常的开发过程中对于性能的考虑也是极其重要的。
关于ef的那些事,今天就来说说吧。首先必须得知道.net ef在程序中的五种状态变化过程与原理。
主要来说说查询部分的性能优化,在所有查询中,客户端查询出来的数据一般来说是不需要进行跟踪的。也就是说查询只是给用户看,不做其他任何操作。对于基于B/S模式的项目网站开发,应该是无状态的,也就是ef中的游离态(Unchanged)(个人理解)。如果是C/S可能还需要进行其他连接的状态。通俗的说,在开发过程不用去检测某一个属性或者类是否被修改或者删除。
例如:
AsNoTracking:它的作用就是在查询的过程中不被缓存,也就是不被保留,查出来就完事了,这样的状态就变成了Detached游离态
//AsNoTracking:它的性能比ToList快大约4.8倍,不被缓存的数据。
var item=db.Book.AsNoTracking().First(m=>m.Id==);
Console.WriteLine(db.Entry(item).State); //输出Detached(游离态)
去掉AsNoTracking
var item=db.Book.First(m=>m.Id==);
Console.WriteLine(db.Entry(item).State); //输出UnChanged(持久态)
也就是加上AsNoTracking做出来的查询操作,就和数据库断绝了关系(个人理解)这样对性能也是一个极好的优化。
然后来说说在项目中对ef整体框架优化的使用。
C#是一门面向对象的语言无外乎就是封装、继承、多态。。。类可以继承类,同样接口也可以继承接口。面向对象的思想就是每张表都应该有一个父类,只写一遍,其他类继承就好了不用重复去写。
建立一个空白的解决方案,添加一个名为BaseEntity的类,你可以把它看做是所有类的基础类(父类)。

重点来说说这个BaseEntity为什么要作为基础类,它的用意何在。
先看看里面的写了些什么吧!
以前用int或者long作为主键自增长的数据类型,这样后期数据非常庞大的时候可能会无法预估难免可能会出现重复的数据,这个时候对于整个系统来说就无法保障了。
Guid给我做出了一个计算,它是32位的数字加字母的组合,而且是特别长的不会重复的自增数,可以这样去理解。
DateTime就是每条数据的创建时间,IsRemove就是作为数据逻辑删除的标识,也就是说,每个类(表)都会存在这三个字段属性。你可以通过DateTime对没张表进行排序的操作。
using System;
namespace Book.Models
{
public class BaseEntity
{
public Guid Id { get; set; }=Guid.NewGuid(); //计算32位,字母加数字,特别长的,不重复的,自增数
public DateTime DateTime { get; set; }=DateTime.Now; //每条数据的创建时间
public bool IsRemove { get; set; } //伪删除的标识
}
}
创建BookType类
using System.ComponentModel.DataAnnotations; namespace Book.Models
{
public class BookType:BaseEntity
{
[StringLength()]
public string Name { get; set; }
}
}
创建Book类
using System.ComponentModel.DataAnnotations; namespace Book.Models
{
public class Book:BaseEntity
{
[StringLength(),Required]
public string Name { get; set; }
public decimal Price { get; set; }
}
}
这两个类都会继承BaseEntity
在App.Config里面写上你自己的数据库连接字符串

这样的目的就是去生成数据库,只做生成数据库的操作。这里只是在Models层写了一次,在后期加上表示层还有在写一遍!
接下来就是去通过指令迁移到数据库,操作有三步:
- 启动迁移:enable-migrations
- 添加迁移:add-migration '参数'
- 更新数据库:update-database(如果你需要添加或者修改某个字段属性,只需要进行第二步和第三步的操作即可!)
记住默认项目要选择你的Models,如果是多个项目(我这里是只有一个)就必须要把Models设为启动项目,不然迁移指令可能不会起到作用

你真的了解EF吗?关于EntityFramework的高级优化的更多相关文章
- EF开发中EntityFramework在web.config中的配置问题
异常: 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序.请确保在应用程序配置文件的“entityFramework”节中注册了该提供程序 ...
- 微软官方 Github 上的 EF 示例项目 EntityFramework.Docs
项目地址:https://github.com/aspnet/EntityFramework.Docs/tree/master/samples/core 谢谢浏览!
- [翻译][MVC 5 + EF 6] 12[完结]:高级场景
原文:Advanced Entity Framework 6 Scenarios for an MVC 5 Web Application 1.执行原生SQL查询: EF Code First API ...
- EntityFramework使用及优化
1. 简介 ORM框架:Object Relation Mapping,用操作对象的方式来操作数据库 其它框架:Dapper.NHibernate,首推EF,微软官方的. EF底层还是ADO.NET实 ...
- EF+MVC+cod First项目性能优化总结
1.EF:this.Configuration.UseDatabaseNullSemantics = true; //关闭数据库null比较行为 2.实体必填字段要加:[Required]属性,可定长 ...
- EntityFramework Code First 优化-IIS 8的第一次优化请求配置
首先需要在Window中添加Application Initialization Application Initialization 在IIS中配置Application Pool 编辑Applic ...
- 【EF】解决EF批量操作,Z.EntityFramework.Extensions 过期方案
方案一: 使用EntityFramework.Extended优点: 启下载量是Z.EntityFramework.Extensions的10倍+ 不会过期缺点:不能批量Insert 方案二:解决批量 ...
- EntityFramework之异步、事务及性能优化(九)
前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...
- EF 分页查询优化
按照通常的方式分页查询至少要查询数据两遍,一个操作是查询总数,另一个是查询数据,这样有些耗时 这里介绍一个基于EF的插件 EntityFramework.Extended,当然这个插件有很多的功能,比 ...
随机推荐
- php的 mysqlnd驱动
这篇文章写的好 http://blog.linuxeye.com/395.html 传统编译php的时候需要指定mysql 的参数 --with-mysql=/usr/local/mysql \ -- ...
- 读懂这几个关键词,你就能了解 Docker 啦
基于高度虚拟化所诞生的容器技术,如今已经走向大规模应用.那么容器.虚拟机.Docker.Openstack.Kubernetes 之间又有什么关系,对现在的选择有什么影响呢? 上世纪 60 年代,计算 ...
- python 机器学习(一)机器学习概述与特征工程
一.机器学习概述 1.1.什么是机器学习? 机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测 1.2.为什么需要机器学习? 解放生产力,智能客服,可以不知疲倦的24小时作业 ...
- Vue element-ui date-picker 结束时间大于开始时间且开始时间小于此刻(转)
转载自:https://blog.csdn.net/wintersweetGirl/article/details/82461412 <el-form ref="form" ...
- 5.5 Go defer
5.5 Go defer 程序开发中经常要创建资源(数据库初始化连接,文件句柄,锁等),在程序执行完毕都必须得释放资源,Go提供了defer(延时机制)更方便.更及时的释放资源. 1.内置关键字def ...
- jquery 滚轴滚动 导航定位和锚点定位
自己写的,只测试了ie9+, firefox,chrome 以下js更好 var fixbar={ init:function(){ "use strict"; // 滚轴 导航位 ...
- 如何分析和提高(C/C++)程序的编译速度?
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/129354 ...
- 测试工程中引入Masonry记录
测试工程中需要引入Masonry,在进行添加新库时发现了几个问题,记录如下,方便有相同问题的朋友查找解决: 1,podfile中添加 pod ‘Masonry’ 后,pod install --v ...
- CF922F Divisibility
题目链接:http://codeforces.com/contest/922/problem/F 题目大意: 对于一个数集 \(I\),定义 \(f(I)\) 为 \(I\) 中满足条件的数对\((a ...
- Redis学习笔记(十五)Sentinel(哨兵)(中)
上一篇 我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作. 为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状 ...