首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架每次编译后第一次加载非常慢

实体框架每次编译后第一次加载非常慢
EN

Stack Overflow用户
提问于 2015-05-24 13:06:08
回答 6查看 57.9K关注 0票数 54

正如标题所示,我在使用实体框架对Server数据库进行第一个查询时遇到了问题。我曾试图寻找答案,但似乎没有人真正有办法解决这个问题。

这些测试是在Visual 2012中使用实体框架6完成的,我还使用T4视图模板预编译视图。数据库位于Server 2008上。我们有大约400个POCOs (400个映射文件),数据库表中只有100行数据。

下面的捕获是我的测试代码和结果。

代码语言:javascript
运行
复制
static void Main(string[] args){
    Stopwatch st=new Stopwatch();
    st.Start();
    new TestDbContext().Set<Table1>.FirstOrDefault();
    st.stop();
    Console.WriteLine("First Time "+st.ElapsedMilliseconds+ " milliseconds");

    st.Reset();
    st.Start();
    new TestDbContext().Set<Table1>.FirstOrDefault();
    st.stop();
    Console.WriteLine("Second Time "+st.ElapsedMilliseconds+ " milliseconds");
}

测试结果

代码语言:javascript
运行
复制
First Time 15480 milliseconds
Second Time 10 milliseconds
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-05-24 14:04:47

在第一个查询中,EF编译模型。对于这么大的模型来说,这可能需要一些严肃的时间。

这里有三个建议:http://www.fusonic.net/en/blog/2014/07/09/three-steps-for-fast-entityframework-6.1-first-query-performance/

摘要:

  1. 使用缓存的db模型存储
  2. 生成预编译视图。
  3. 使用n-gen生成实体框架的预编译版本,以避免跳转。

我还将确保在执行基准测试时,以发布模式编译应用程序。

另一个解决方案是考虑拆分DBContext。400个实体非常多,与较小的块一起工作应该更好。我还没有试过,但我认为可以一个接一个地构建模型,这意味着没有单一的负载需要15s。参见朱莉·勒曼https://msdn.microsoft.com/en-us/magazine/jj883952.aspx撰写的这篇文章

票数 46
EN

Stack Overflow用户

发布于 2018-10-18 17:30:27

使用EF,您可以在调用services.AddDbContext后早期欺骗和加载模型(您可能也可以使用EF6进行类似的操作,但我还没有对其进行测试)。

代码语言:javascript
运行
复制
services.AddDbContext<MyDbContext>(options => ...);
var options = services.BuildServiceProvider()
                      .GetRequiredService<DbContextOptions<MyDbContext>>();
Task.Run(() =>
{
    using(var dbContext = new MyDbContext(options))
    {
        var model = dbContext.Model; //force the model creation
    }
});

这将在另一个线程中创建dbcontext模型,同时完成应用程序的其余初始化(可能还有其他warmup)和请求的开始。这样,它就会准备得更快。当您需要它时,如果模型尚未完成,EFCore将等待模型的创建。Model是在所有dbcontext实例之间共享的,因此可以触发并忘记这个虚拟DbContext。

票数 12
EN

Stack Overflow用户

发布于 2018-01-07 21:02:06

你可以试试这样的方法:(这对我有用)

代码语言:javascript
运行
复制
protected void Application_Start()
{

    Start(() =>
    {
        using (EF.DMEntities context = new EF.DMEntities())
        {
            context.DMUsers.FirstOrDefault();
        }
    });
}
private void Start(Action a)
{
    a.BeginInvoke(null, null);
} 

Entity Framework - First query slow

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30423838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档