实体框架代码前30秒启动时间

时间:2015-06-18 03:07:48

标签: c# performance entity-framework code-first startup

我知道这已被问了太多次,但我无法从问题中找出解决方案。

我是Entity Framework的新手,我使用Entity Framework 6和Code First方法为我的网站开发了一个小型CMS面板。我的问题是,首次运行时网站速度很慢(这是我目前正在测试的网站www.oakwoodpawnshop.ca),加载需要30秒以上。  第一次加载后,加载其他页面大约需要一秒钟。我从PageSpeed见解得到89/100,我的所有images / js / css文件都被最小化,并做了一些其他的前端优化,所以我知道我的问题在于EF。我有一个大约3年前建立的另一个网站,只使用LINQ,没有数据库优化或html /图像优化,它在大约3秒内打开。

我使用Entity Framework Power Tools预先生成了视图,而且我的代码中没有任何Include方法。我在.toList()函数之前过滤了我的查询。我的代码或数据库优化可能有问题,但我无法通过我的研究得出解决方案,因为这个区域对我来说是新的。

我发现一篇用我母语的文章,要求有相同问题的人在命令提示符下运行一些代码,看看问题是否与网络设置有关。

这些是命令提示符的行:

1 - netsh int ip reset a.txt

2 - netsh winsock reset

3 - netsh winhttp重置代理

4 - netsh advfirewall reset

5 - ipconfig / flushdns

6 - 重新启动计算机并再次检查。

当我这样做并检查回网站时,整个网站在3秒内打开。过了一会儿,它又开始有30多秒的启动时间了。显然我不能在每个人的计算机上运行这些命令,但我迷失了,我不知道为什么要花很长时间才能开始。

以下是我正在使用的方法示例:

public List<Categories> GetCategories()
    {
        List<Categories> c = db.Categories.Where(x => x.TopCategoryId == 0).OrderBy(x => x.CatOrder).ToList();

        return c;
    }

我创建了自定义方法来获取我的数据(因此我可以更轻松地使用它们),在“工作人员”下工作。用于在一个类中收集所有方法的类。这可能是问题吗?

我很乐意提供您需要的更多信息,我现在处理这个问题大约一个月没有运气,所以我无可救药地寻找答案,否则我将不得不重新创建整个没有EF的申请,因为客户无法等待开放时间为+30秒的网站。

提前感谢您的所有建议!

1 个答案:

答案 0 :(得分:1)

您可以初始化Entity Framework数据库。将DbContext替换为您的上下文类:

using(var context = new DbContext())
{
    context.Database.Initialize(false);
}

如果您使用的是asp.net mvc,可以从Application_Start()方法执行此操作。但是,您需要使用Application Initialization模块(IIS 7.5可用作extension)。修改应用程序池条目,以便始终运行应用程序池。删除空闲超时。在特定时间(例如,04:00 AM)配置IIS应用程序池回收。您可能需要在Web.config中指定初始化页面(&#39; /&#39;是默认值):

<applicationInitialization>
  <add initializationPage="/initialze" />
</applicationInitialization>

这些步骤不会完全预热实体框架,但会大大减少冷启动时间。