夸克之书

  • 首页
  • 科普
  • 笔记
  • C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. 默认
  3. 正文

EF第一次加载较慢的原因以及解决方法(汇)(转)

2019-02-26 3148点热度 0人点赞 0条评论

因为遇到这个问题,查找了一番,根据这篇文章做出修改确实有很不错的效果,特此记录一下。本篇转载来源:https://blog.csdn.net/ma15732625261/article/details/72541184

为什么会慢:

在应用程序中定义的每个上下文,其首次使用时,JUST-INTIME编译器:Entity Framework都会根据数据库中的信息在内存中生成一个映射视图(mapping views),这个操作非常耗时。定义的每一个上下文都会受此困扰。

1、Code First第一次启动会对比程序中的Model与数据库表(database initializer ),生成Model与数据库的映射视图。
2、EF从6开始安装.net Framework默认不会安装EF。因此EF程序集就没有生成本地镜像,这样每次程序启动,EF的代码都会通过just-in-time (JIT) compiler把MSIL中间代码编译成本机能识别的本地代码(存在程序运行的进程的内存中),当程序进程被终止它将回收(例如:iis程序池回收,程序池默认是按需触发运行的,没人访问它就不启动了)。由于EF框架还是比较大的,EF6文件大小到4-5M了,所以每次启动都要重写编译本地代码有比较明显的性能影响。 3,MVC的程序第一次访问比较慢的的问题由于第一次是要处理视图文件.cshtml(生成为.cs文件)、加载引用的dll程序文件和初始化程序池等等

解决一、EF暖机操作

在应用程序初始化时一次性触发所有的DbContext进行mapping views的生成操作——调用StorageMappingItemCollection的GenerateViews()方法。

using (var dbcontext = new CnblogsDbContext())
{
    var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
    var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
    mappingCollection.GenerateViews(new List<EdmSchemaError>());
}

对于ASP.NET应用程序 ,可以将上面的代码放在Application_Start或者PreApplicationStartMethod中执行。

解决二、application Initialization iIIS8内置功能,安装Application Initialization Module for IIS 7.5。

%title插图%num
%title插图%num


解决三、 用Ngen安装生成EF的本地镜像

Ngen创建本机映像native-code并将其安装到本机映像缓存中,可通过内存映射被多个进程共享 本机影像生成器(Ngen.exe)工具使用实践 
NGen是个什么东西?

解决四、 禁用第一次ef查询对表__MigrationHistory的问题

使用了ef的Code first会在第一次ef查询的时候会对__MigrationHistory访问,是为了检查数据库和model是否匹配,以保证ef能正常运行。通过监测会先执行下面的sql:
SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
)  AS [GroupBy1]
GO

SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[ModelHash] AS [ModelHash]
FROM [dbo].[EdmMetadata] AS [Extent1]
ORDER BY [Extent1].[Id] DESC
GO
这段sql语句其实中只是在开发的时候有用,发布到生产环境,可以把这个给禁用了以提高性能。解决办法:
Application_Start加代码
Database.SetInitializer<上下文>(null);
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

afirefish

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论
放松一下
https://www.quarkbook.com/wp-content/uploads/2021/05/凤凰传奇-海底(Live).flac
分类
  • C#
  • Linux
  • 树莓派
  • 物联网
  • 科普
  • 笔记
  • 算法
  • 默认
最新 热点 随机
最新 热点 随机
Windows移除多余输入法'Unknown Locale (qaa-Latn)' 【算法】具有层级关系的城市,例如"中国 广州","中国 浙江 杭州" 一个 List 最后应该是转成树状图输出 树莓派安装Golang环境 树莓派 Zero USB/以太网方式连接配置教程 树莓派Zero 2 w超频 PVE使用山克UPS(ViewPower)
解决Visual Studio 2022中无法编译 .NET Framework 4.5/4.5.1项目(Visual Studio 2022安装.NET Framework 4.5)PVE使用山克UPS(ViewPower)树莓派Zero 2 w超频树莓派 Zero USB/以太网方式连接配置教程树莓派安装Golang环境【算法】具有层级关系的城市,例如"中国 广州","中国 浙江 杭州" 一个 List 最后应该是转成树状图输出
Visual Studio 2019(VS2019) 密钥/激活码 解决Visual Studio 2022中无法编译 .NET Framework 4.5/4.5.1项目(Visual Studio 2022安装.NET Framework 4.5) Visual Studio调试时不中断自定义异常 OpenWrt x86安装Frpc 树莓派4B配置U盘启动 Debian 9开启Google BBR
最近评论
去月球 发布于 4 个月前(01月17日) 如果使用CSI的摄像头应该怎么修改命令呢
Me 发布于 5 个月前(12月31日) 好像还得写启动项 要不重启就还原了。
十三 发布于 5 个月前(12月23日) 大神,网盘链接失效了,重新分享一下吧,
一键快乐 发布于 11 个月前(07月09日) 老哥 我替换之后能进去了但是网络和声音上有两个×怎么办
翩翩蒯公子 Maxwell 发布于 1 年前(05月15日) 赞一个,挺好的文章。
书签
  • 打赏
  • 毒鸡汤(有点意思)
  • 米店
  • 金鱼直播间

COPYRIGHT © 2022 quarkbook.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备15036129号-9

登录
注册|忘记密码?