【问题标题】:Entity Framework SaveChanges() first call is very slow实体框架 SaveChanges() 第一次调用很慢
【发布时间】:2011-06-20 09:25:59
【问题描述】:

我很感激这个问题之前已经提出过几次,但我找不到明确的答案(也许没有答案!)。

无论如何,标题确实说明了一切。创建一个新上下文,添加一个新实体,SaveChanges() 需要 20 秒。在同一上下文中添加第二个实体 SaveChanges() 即时。

对此有什么想法吗? :-)

============更新=============

我创建了一个非常简单的应用程序,针对我现有的模型运行以显示问题...

    public void Go()
    {
        ModelContainer context = new ModelContainer(DbHelper.GenerateConnectionString());

        for (int i = 1; i <= 5; i++)
        {
            DateTime start = DateTime.Now;
            Order order = context.Orders.Single(c => c.Reference == "AA05056");
            DateTime end = DateTime.Now;
            double millisecs = (end - start).TotalMilliseconds;
            Console.WriteLine("Query " + i + " = " + millisecs + "ms (" + millisecs / 1000 + "s)");

            start = DateTime.Now;
            order.Note = start.ToLongTimeString();
            context.SaveChanges();
            end = DateTime.Now;
            millisecs = (end - start).TotalMilliseconds;
            Console.WriteLine("SaveChanges " + i + " = " + millisecs + "ms (" + millisecs / 1000 + "s)");

            Thread.Sleep(1000);
        }

        Console.ReadKey();
    }

请不要评论我的代码——除非它是一个无效的测试;)

结果是:

查询 1 = 3999.2288ms (3.9992288s)
SaveChanges 1 = 3391.194ms (3.391194s)

查询 2 = 18.001 毫秒 (0.018001 秒)
SaveChanges 2 = 4.0002ms (0.0040002s)

查询 3 = 14.0008 毫秒(0.0140008 秒)
SaveChanges 3 = 3.0002ms (0.0030002s)

查询 4 ​​= 13.0008ms (0.0130008s)
SaveChanges 4 = 3.0002ms (0.0030002s)

查询 5 = 10.0005ms (0.0100005s)
SaveChanges 5 = 3.0002ms (0.0030002s)

第一个查询需要时间,我假设是视图生成?还是db连接?

第一次保存需要将近 4 秒,对于我的应用程序中更复杂的保存需要超过 20 秒,这是不可接受的。

现在不知道该去哪里 :-(

更新...

SQL Profiler 显示第一次查询和更新很快,并且第一次没有什么不同。所以我知道延迟是怀疑的实体框架。

【问题讨论】:

  • 你的模型有多大?这是您对上下文进行的第一次操作(查询也很重要)吗?
  • @Steven - 不确定你的意思。可以扩展吗? @Ladislav - 这是第一个 SaveChanges() 但在同一上下文中有以前的查询。我正在保存一个相对复杂的订单,系统上有 10,000 多个订单。这不是最容易调试的项目,因此可能会将示例应用程序放在一起以帮助调试。我(暂时)进行了修复,修复了许多性能问题,但对保存时间没有影响。我尝试了预生成视图,但这似乎几乎没有效果。
  • 虽然订单非常复杂(18 个 FK 等),但同一订单副本上的第二个 SaveChanges() 几乎是即时的 - 如果在相同的上下文中。
  • 我想澄清一下 - 模型中有大约 150 个实体。
  • 这里也可能发生了一些 JIT。您是否在测试运行之间更改代码/重新编译?

标签: performance entity-framework entity-framework-4 savechanges


【解决方案1】:

它可能不是 SaveChanges 调用 - 当您第一次在 EF 中对数据库进行任何调用时,它必须从元数据中生成一些初始代码。您可以在编译时预先生成它:http://msdn.microsoft.com/en-us/library/bb896240.aspx

如果这是唯一的问题,我会感到惊讶,但它可能会有所帮助。

也可以看看这里:http://msdn.microsoft.com/en-us/library/cc853327.aspx

【讨论】:

    【解决方案2】:

    我会在应用启动时运行以下代码,看看需要多长时间,然后第一次 SaveChanges 是否很快。

        public static void UpdateDatabase()
        {
            //Note: Using SetInitializer is reconnended by Ladislav Mrnka with reputation 275k
            //http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start
            Database.SetInitializer<DAL.MyDbContext>(
                new MigrateDatabaseToLatestVersion<DAL.MyDbContext,
                Migrations.MyDbContext.Configuration>());
    
            using (var db = new DAL.MyDbContext()) { 
                db.Database.Initialize(false);//Execute the migrations now, not at the first access
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2019-12-04
      • 2020-12-03
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      相关资源
      最近更新 更多