2012-02-13 4 views
3

Из обширного поискового запроса, похоже, что я не первый человек, столкнувшийся с этой проблемой, но я не смог найти никого, кто смог бы его удовлетворительно решить - я интегрирую с устаревшей базой данных, и я только пытаюсь интегрироваться с одной таблицей (на данный момент), но мой первый запрос к этой модели занимает около 12 секунд или около того. Второй звонок почти мгновен, как и ожидалось.Entity Framework Code-First очень медленный

Ниже полнота моего Entity Framework Code First установки:

public class PortalDatabase : DbContext 
{ 
    public DbSet<User> Users { get; set; } 

    public PortalDatabase():base("portalDatabase") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     User.ConfigureEntity(modelBuilder.Entity<User>()); 
    } 
} 

public class User 
{ 
    public int ID { get; set; } 

    public string FullName { get; set; } 

    /// <summary> 
    /// Internal representation of the IsDisabled flag. This should not be 
    /// written to; use <see cref="IsDisabled"/> instead. 
    /// </summary> 
    internal byte IsDisabledInternal { get; set; } 

    public bool IsDisabled 
    { 
     get { return Convert.ToBoolean(this.IsDisabledInternal); } 
     set { this.IsDisabledInternal = Convert.ToByte(value); } 
    } 

    public int LoginAttempts { get; set; } 

    public string EmailAddress { get; set; } 

    public string Password { get; set; } 

    internal static void ConfigureEntity(EntityTypeConfiguration<User> entity) 
    { 
     entity.ToTable("Users"); 

     entity.Property(model => model.ID) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
      .HasColumnName("UserID"); 

     entity.Property(model => model.FullName) 
      .HasColumnName("UserName"); 

     entity.Property(model => model.IsDisabledInternal) 
      .HasColumnName("AccountLocked"); 

     entity.Ignore(model => model.IsDisabled); 

     entity.Property(model => model.LoginAttempts) 
      .HasColumnName("LoginAttempts"); 

     entity.Property(model => model.EmailAddress) 
      .HasColumnName("EmailAddress"); 

     entity.Property(model => model.Password) 
      .HasColumnName("Password"); 
    } 
} 

Этот пример кода занимает 8-12 секунд, чтобы выполнить:

PortalDatabase database = new PortalDatabase(); 

    IEnumerable<User> users = from user in database.Users 
           where user.ID == 66 
           select user; 

Я понимаю, что этот вопрос должен сделать с генерированием метаданных, который выполняется только один раз, который according a comment from ScottGu «улучшает производительность»:

Th В библиотеке «первый код» используется тот же базовый EF, что и традиционный подход, поэтому характеристики производительности должны быть примерно одинаковыми. Библиотека «первый код» также включает в себя aome smarts, так что метаданные, которые извлекаются для сопоставления в/из базы данных, кэшируются - так, что их нужно только вычислить (что значительно повышает производительность).

Но это характеристика, которую я описал в среднем? Я не могу себе представить, что принятие 12 секунд для выполнения простого запроса всегда приемлемо для команды Entity Framework. Неужели я его не понимаю? Сохраняется ли кеш метаданных в течение всего жизненного цикла, например, пула приложений IIS? Это может быть в некотором роде приемлемым, хотя и вряд ли идеальным.

Если я не использовал код первым, тогда я смог бы use EdmGen.exe to generate my views, что, как я понимаю, значительно ускорит мое приложение. Существует ли эквивалент при разработке моей модели с использованием кода?

Обновление 14 февраля 2012 г.: Благодаря Pawel's post, я смог сгенерировать свои представления. К сожалению, это не изменило скорость создания нового экземпляра PortalDatabase, который по-прежнему занимает столько же времени. Я знаю, что представления используются, потому что я поставил точку останова в конструкторе, но это ни на что не влияет.

+0

Кэш метаданных существует для жизни * AppDomain *. Загрузка метаданных происходит медленно, но 12 секунд * очень медленны для такой простой модели. – Slauma

+0

Я скопировал вашу модель в консольное приложение, создал пустую базу данных (автоматически EF). 1-й запрос занял 1 секунду, второй запрос вернулся мгновенно. Эти 12 секунд странные ... – Slauma

ответ

2

Для создания представлений с использованием CodeFirst EF Power Tools. Подробнее см. Здесь: http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx

+0

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

+0

Вы определили, что занимает время? Это просто первый запрос или все запросы медленны? Если это всего лишь запрос, это может быть, скорее всего, одна из двух вещей - просмотр генерации (не должно происходить для небольших моделей) или создание базы данных, если ее не существует. Вы видите медленность, когда база данных существует? Кроме того, вы пытались подключиться к базе данных вручную? Было ли это быстро? Если это происходит для всех запросов - можете ли вы попытаться использовать Sql Profiler, чтобы узнать, сколько времени требуется для выполнения запросов? Также вы используете более продвинутое сопоставление, например, иерархии или разделение объектов? – Pawel

+0

Если ваша модель так же проста, как указано выше, вы не должны ожидать большого снижения производительности от EF/CodeFirst. Для такой модели я бы посмотрел на сеть/db. – Pawel

Смежные вопросы