Из обширного поискового запроса, похоже, что я не первый человек, столкнувшийся с этой проблемой, но я не смог найти никого, кто смог бы его удовлетворительно решить - я интегрирую с устаревшей базой данных, и я только пытаюсь интегрироваться с одной таблицей (на данный момент), но мой первый запрос к этой модели занимает около 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, который по-прежнему занимает столько же времени. Я знаю, что представления используются, потому что я поставил точку останова в конструкторе, но это ни на что не влияет.
Кэш метаданных существует для жизни * AppDomain *. Загрузка метаданных происходит медленно, но 12 секунд * очень медленны для такой простой модели. – Slauma
Я скопировал вашу модель в консольное приложение, создал пустую базу данных (автоматически EF). 1-й запрос занял 1 секунду, второй запрос вернулся мгновенно. Эти 12 секунд странные ... – Slauma