7 Sekunden EF-Startzeit, auch für winzigen DbContext

Ich versuche, die Startzeit meiner EF-basierten Anwendung zu verkürzen, finde aber, dass ich die Zeit, die für einen ersten Lesevorgang benötigt wird, nicht unter 7 Sekunden reduzieren kann, auch nicht für einen Einzelentitätskontext. Besonders merkwürdig ist, dass diese Zeit nicht kontextabhängig ist.

Kann jemand erklären, was diese langsamen Zeiten verursacht und / oder wie ich die Dinge schneller laufen lassen kann?

Hier ist der vollständige Beispielcode:

In meiner Datenbank habe ich eine Tabelle namens se_stores mit einer Primärschlüsselspalte 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);

Es wird zuverlässig so etwas wie das Folgende gedruckt: 7.5277527, 0.060006. Wenn ich den Test zuerst auf die Verwendung von MyDbContext2 umstelle, erhalte ich dasselbe Ergebnis (dies geschieht also für jeden DbContext, der zuerst initialisiert wird). Ich habe auch versucht, Ansichten mit EF-Elektrowerkzeugen vorab zu generieren. Dies verkürzte die Zeit für den ersten Kontext auf rund 6,8 ​​Sekunden und war somit nur ein kleiner Gewinn.

Ich verstehe, dass DateTime.Now eine schreckliche Methode zur Profilerstellung ist, aber diese Ergebnisse haben sich bei der Verwendung von dotTrace nicht verändert. Mir ist auch bewusst, dass das erstmalige Ausführen von Code JIT-Kosten verursacht, aber 7 Sekunden scheinen viel zu hoch zu sein, um dies zuzuordnen.

Ich verwende EF 4.3.1 und .NET 4 mit VS 2010.

Vielen Dank im Voraus für Ihre Hilfe!

BEARBEITEN: Es wurde vorgeschlagen, dass das Öffnen der SQL-Verbindung das Problem verursachen könnte.

Ich habe zuerst versucht, eine zufällige Abfrage mit einer unformatierten SqlConnection auszuführen und einen Befehl mit derselben Verbindungszeichenfolge zu erstellen. Dies dauerte 1 Sekunde und hatte keinen Einfluss auf den Zeitpunkt der DbContext-Initialisierung.Ich habe dann versucht, eine SqlConnection mit der Verbindungszeichenfolge zu erstellen und sie an den Konstruktor von DbContext weiterzuleiten, der eine Verbindung herstellt. Ich habe contextOwnsConnection = false übergeben. Dies machte auch keinen Unterschied in der DbContext-Initialisierungszeit.Schließlich habe ich versucht, eine Verbindung über Management Studio herzustellen, wobei ich dieselben Anmeldeinformationen und Verbindungszeichenfolgenoptionen verwendet habe. Das war fast augenblicklich.Im dotTrace-Profil wird SqlConnectionFactory.CreateConnection (connectionString) mit 0,7 Sekunden gemessen, was mit der unformatierten SQL-Zeit übereinstimmt.

EDIT: Ich wollte wissen, ob die Verzögerung pro Verbindung oder nur einmal war. Daher habe ich versucht, MyDbContext1 und MyDbContext2 mit völlig unterschiedlichen Datenbanken auf unterschiedlichen Servern zu verbinden. Dies hat keinen Unterschied gemacht, unabhängig davon, mit welcher Datenbank zuerst eine Verbindung hergestellt wurde: Die Verwendung eines ersten DbContext-Objekts dauerte ~ 7 Sekunden, während die Verwendung eines zweiten Kontexts unglaublich schnell ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage