7-секундное время запуска EF даже для крошечного DbContext

Я пытаюсь сократить время запуска моего приложения на основе EF, но обнаружил, что не могу уменьшить количество времени, затрачиваемое на начальное чтение менее 7 секунд, даже для контекста с одной сущностью. Какие'Особенно странно, что это время не зависит от типа контекста.

Может кто-нибудь объяснить, что вызывает эти медленные времена и / или как я могу заставить вещи работать быстрее?

Вот's полный пример кода:

В моей базе данных есть таблица с именем se_stores и столбцом первичного ключа AptId:

    // a sample entity class
public class Apartment
{
    public int AptId { get; set; }
}

    // two identical DbContexts        

public class MyDbContext1 : DbContext
{
    public MyDbContext1(string connectionString) : base(connectionString)
    {           
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(null);

        var config = new EntityTypeConfiguration();
        config.HasKey(a => a.AptId).ToTable("se_stores");
        modelBuilder.Configurations.Add(config);

        base.OnModelCreating(modelBuilder);
    }
}

public class MyDbContext2 : DbContext
{
    public MyDbContext2(string connectionString)
        : base(connectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(null);

        var config = new EntityTypeConfiguration();
        config.HasKey(a => a.AptId).ToTable("apartments");
        modelBuilder.Configurations.Add(config);

        base.OnModelCreating(modelBuilder);
    }
}

    // finally, I run this code using NUnit:

var start = DateTime.Now;
var apt1 = new MyDbContext1(connectionString).Set().FirstOrDefault();
var t1 = DateTime.Now - start;
start = DateTime.Now;
var apt2 = new MyDbContext2(connectionString).Set().FirstOrDefault();
var t2 = DateTime.Now - start;
Console.WriteLine(t1.TotalSeconds + ", " + t2.TotalSeconds);

Он надежно печатает что-то вроде следующего: 7.5277527, 0.060006. Когда я сначала переключаю тест на использование MyDbContext2, я получаю тот же результат (так происходит в зависимости от того, какой DbContext инициализируется первым). Я также пробовал предварительно генерировать представления с помощью электроинструментов EF. Это сократило время для первого контекста до 6,8 секунд и, таким образом, было лишь небольшим выигрышем.

Я понимаю, что DateTime.Now - ужасный метод профилирования, но эти результаты сохраняются при использовании dotTrace. Я'Мне также известно, что запуск некоторого кода в первый раз требует затрат JITing, но 7 секунд кажутся слишком высокими, чтобы приписать это.

Я использую EF 4.3.1 и .NET 4 с VS 2010.

Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ: было предложено, что открытие соединения SQL может быть причиной проблемы.

Сначала я попытался выполнить случайный запрос с использованием необработанного SqlConnection и создать команду с той же строкой подключения. Это заняло 1 секунду и не повлияло на время инициализации DbContext.Затем я попытался создать SqlConnection со строкой подключения и передать его в DbContext 'S конструктор, который принимает соединение. Я передал contextOwnsConnection = false. Это также не имело никакого значения во времени инициализации DbContext.Наконец, я попытался подключиться через Management Studio, используя те же учетные данные и параметры строки подключения. Это было почти мгновенно.В профиле dotTrace он измеряет SqlConnectionFactory.CreateConnection (connectionString) как занимающий 0,7 секунды, что согласуется с необработанным временем SQL.

РЕДАКТИРОВАТЬ: я хотел знать, была ли задержка для соединения или только один раз. Таким образом, я попытался подключить MyDbContext1 и MyDbContext2 к совершенно разным базам данных на разных серверах. Это не имеет значения независимо от того, какая база данных была подключена к первой: использование первого DbContext заняло ~ 7 секунд, в то время как использование второго контекста невероятно быстро.

Ответы на вопрос(2)

Ваш ответ на вопрос