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

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

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

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

В моей базе данных есть таблица с именем 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<MyDbContext1>(null);

        var config = new EntityTypeConfiguration<Apartment>();
        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<MyDbContext2>(null);

        var config = new EntityTypeConfiguration<Apartment>();
        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<Apartment>().FirstOrDefault();
var t1 = DateTime.Now - start;
start = DateTime.Now;
var apt2 = new MyDbContext2(connectionString).Set<Apartment>().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 может быть причиной проблемы.

I first tried running a random query using a raw SqlConnection and create command with the same connection string. This took 1 second and did not affect the time of DbContext initialization. I then tried creating a SqlConnection with the connection string and passing it through to DbContext's constructor that takes a connection. I passed contextOwnsConnection=false. This also made no difference in the DbContext initialization time. Finally, I tried connecting through management studio using the same credentials and connection string options. This was nearly instantaneous. In the dotTrace profile, it measures SqlConnectionFactory.CreateConnection(connectionString) as taking 0.7 seconds, which is consistent with the raw SQL time.

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

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

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