Entity Framework SaveChanges () первый вызов очень медленный - PullRequest
2 голосов
/ 20 июня 2011

Я ценю, что этот вопрос уже поднимался пару раз, но я не могу найти однозначного ответа (возможно, его нет!).

В любом случае название говорит обо всем на самом деле. Создайте новый контекст, добавьте новый объект, 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,2288 мс (3,9992288 с)
SaveChanges 1 = 3391,194мс (3,391194с)

Запрос 2 = 18,001 мс (0,018001 с)
SaveChanges 2 = 4.0002ms (0.0040002s)

Запрос 3 = 14.0008 мс (0.0140008 с)
SaveChanges 3 = 3.0002ms (0.0030002s)

Запрос 4 = 13 000 8 мс (0,013 000 8 с)
SaveChanges 4 = 3.0002ms (0.0030002s)

Запрос 5 = 10.0005мс (0.0100005с)
SaveChanges 5 = 3.0002ms (0.0030002s)

Первый запрос занимает время, которое, как я полагаю, является генерацией представления? Или дб соединение?

Первое сохранение занимает около 4 секунд, что для более сложного сохранения в моем приложении занимает более 20 секунд, что недопустимо.

Не уверен, куда идти с этим сейчас: - (

UPDATE ...

SQL Profiler показывает, что первый запрос и обновление выполняются быстро и не отличаются для первого. Итак, я знаю, что задержка - это Entity Framework, как и предполагалось.

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Это может быть не вызов SaveChanges - при первом обращении к базе данных в EF необходимо выполнить начальную генерацию кода из метаданных.Вы можете предварительно сгенерировать это, хотя во время компиляции: http://msdn.microsoft.com/en-us/library/bb896240.aspx

Я был бы удивлен, если это единственная проблема, но это могло бы помочь.*http://msdn.microsoft.com/en-us/library/cc853327.aspx

0 голосов
/ 08 ноября 2016

Я бы запустил следующий код при запуске приложения и увидел бы, сколько времени это займет, и если после этого первый 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
        }
    }
...