你真的了解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,当然这个插件有很多的功能,比 ...
随机推荐
- 如何通过VMware安装Linux CentOS 7.7系统
如何在Vmware安装Linux CentOS 7.7系统,并且是最小化安装.之后进行必要的配置修改,并实现基础优化.最后做一个快照. 安装Linux CentOS 7.7 安装要求:安装后的虚拟机用 ...
- 黑马程序员_毕向东_Java基础视频教程——switch语句练习(随笔)
switch(练习) /* if和 switch 语句很像. 具体什么场景下使用什么语句呢? 如果判断的具体数值不多且符合byte.short.int.char.String类型,虽然两个语句都可以使 ...
- 使用php+mysql+xml完成一个调查问卷
本人根据php典型模块与项目实战大全此书所完成的一个调查问卷,同时管理员可以进行修改调查内容 同时用到了一个css文件,借鉴于 http://www.wufangbo.com/div-css-vote ...
- Centos7访问Win7/Win10系统中的共享文件
服务器挂在U盘: 1.先将U盘格式化为Fat格式或其他服务器能识别的格式. 2.使用fdisk -l,找到自己的U盘(根据盘大小) 3.新建一个文件夹(mkdir /mnt/usb)用于挂在数据 4. ...
- 配置Universal Links
参考: https://www.cnblogs.com/GJ-ios/p/9583141.html https://blog.csdn.net/saw471/article/details/10106 ...
- 树状数组区间更新区间查询以及gcd的logn性质
题目描述 给你一个长为n的序列a m次查询 每次查询一个区间的所有子区间的gcd的和mod1e9+7的结果 输入描述: 第一行两个数n,m之后一行n个数表示a之后m行每行两个数l,r表示查询的区间 输 ...
- Consul+upsync+Nginx实现动态负载均衡
上一篇文章 <C# HttpClient 使用 Consul 发现服务> 解决了内部服务之间的调用问题, 对外提供网关服务还没有解决, 最后我选择了 nginx-upsync-module ...
- html5学习之路_006
表单与php交互 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- String类练习
1.模拟一个trim方法,去除字符串两端的空格 2.将一个字符串进行反转.将字符串中指定部分进行反转 3.获取一个字符串在另一个字符串中出现的次数 4.获取两个字符串中最大相同子串 5.对字符串中字符 ...
- DNS域传输漏洞利用总结
操作基本的步骤是: 1) 输入nslookup命令进入交互式shell 2) Server 命令参数设定查询将要使用的DNS服务器 3) Ls命令列出某个域中的所有域名 4) Exit命令退出程序 攻 ...