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

EF очень медленно при получении информации о поставщике из базы данных

Я обнаружил, что большой компонент медленного времени запуска EF может быть связан с получением информации о провайдере из базы данных. Это очень раздражает при выполнении интеграционных тестов или других итеративных разработок. Может ли кто-нибудь объяснить, почему получение информации о поставщике происходит медленно или что можно сделать по этому поводу? Мы используем EF5.

Вот пример, демонстрирующий это поведение:

void Main()
{
    Database.SetInitializer<ModelDbContext>(null);
    Database.SetInitializer<ModelCreatingDbContext>(null);

    // passing the provider information in is very fast
    var sw2 = Stopwatch.StartNew();
    var builder = new DbModelBuilder();
    builder.Entity<SqlConnectionStringBuilder>().HasKey(c => c.ConnectionString).ToTable("strings");
    var q2 = new ModelDbContext(builder.Build(new DbProviderInfo("System.Data.SqlClient", "2008")).Compile()).Set<SqlConnectionStringBuilder>().Take(1).ToString();
    Console.WriteLine(sw2.Elapsed); // < 1 second

    // letting EF determine it from the connection string is sometimes very slow
    var sw1 = Stopwatch.StartNew();
    var q = new ModelCreatingDbContext().Set<SqlConnectionStringBuilder>().Take(1).ToString();
    Console.WriteLine(sw1.Elapsed); // can be upwards of 13 seconds!

}

public class ModelDbContext : DbContext {
    public static readonly string Connection = // connection string here

    public ModelDbContext(DbCompiledModel model) 
        : base(Connection, model) { }
}

public class ModelCreatingDbContext : DbContext {
    public ModelCreatingDbContext() : base(ModelDbContext.Connection) { }

    protected override void OnModelCreating(DbModelBuilder builder) {
        builder.Entity<SqlConnectionStringBuilder>().HasKey(c => c.ConnectionString).ToTable("strings");

        base.OnModelCreating(builder);
    }
}
4b9b3361