Подтвердить что ты не робот

Эксплуатационные затраты на создание ObjectContext в каждом методе в Entity Framework v1

При использовании .NET 3.5 SP1 в приложении ASP.NET MVC объект ObjectContext может иметь время жизни в одном запросе Http ИЛИ метода SINGLE.

using (MyEntities context =  new MyEntities ())
{
//DO query etc
}

Сколько стоит увеличение производительности для создания ObjectContext в каждом методе VS для запроса?

Спасибо.

4b9b3361

Ответ 1

Стоимость создания контекста очень низкая. Однако использование нового контекста означает, что у вас нет кэшированных запросов из предыдущих контекстов. Вы можете в некоторой степени обойти это с помощью создания представлений или CompiledQuery. См. Также Рекомендации по производительности для приложений Entity Framework

С другой стороны, сохранение контекста в течение длительного времени означает, что вы отслеживаете увеличение количества информации о состоянии, которая имеет собственную стоимость исполнения.

Однако, на мой взгляд, наиболее значительная стоимость контекста - это сложность кода. Использование нескольких контекстов ведет к запутыванию кода. Поэтому я пытаюсь использовать один контекст для каждой группы связанных операций, например. обработка одного HTTP-запроса.

Ответ 2

Является ли базовая модель маленькой или большой, простой или сложной? Стоимость инициализации и использования нового objectcontext растет с размером и сложностью модели. Если у вас есть несколько объектов, это обычно не учитывается. Если у вас есть сотни объектов, это может быть значительным.

См:
http://oakleafblog.blogspot.com/2008/08/entity-framework-instantiation-times.html
и
http://blogs.msdn.com/adonet/archive/2008/06/20/how-to-use-a-t4-template-for-view-generation.aspx

Ответ 3

Я использую EF6 и схему из 163 объектов, которые сначала генерируются db из oracle.

Я измеряю время и время инициализации, чтобы получить 100 записей из индексированной таблицы.

Тест С#

var times = new List<Tuple<DateTime, DateTime, DateTime>>();
var carTypes = new List<CAR_TYPE>();
var j = 1;
while (j <= 10000)
{
    for (int i = 0; i < j; i++)
    {
        var startTime = DateTime.Now;

        using (var db = new EcomEntities())
        {
            var contextInitializationTime = DateTime.Now;
            carTypes = db.CAR_TYPE.Take(100).ToList();
            var executionTime = DateTime.Now;
            times.Add(new Tuple<DateTime, DateTime, DateTime>(startTime, contextInitializationTime, executionTime));
        }
    }
    var averageInitTime = times.Average(o => o.Item2.Subtract(o.Item1).TotalMilliseconds);
    var averageRunTime = times.Average(o => o.Item3.Subtract(o.Item1).TotalMilliseconds);
    Debug.WriteLine("averageInitTime - " + j + " " + averageInitTime);
    Debug.WriteLine("averageRunTime - " + j + " " + averageRunTime);
    j = j*10;
}

Результаты:

                    Runs        MS                         Runs      MS
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime  | 1     | 134.0134 | averageRunTime  | 1     | 1719.172 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime  | 10    | 12.27395 | averageRunTime  | 10    | 160.3797 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime  | 100   | 1.540695 | averageRunTime  | 100   | 19.94794 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime  | 1000  | 0.281756 | averageRunTime  | 1000  | 6.121224 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime  | 10000 | 0.167058 | averageRunTime  | 10000 | 4.751353 |
+------------------+-------+----------+-----------------+-------+----------+