根据广泛的谷歌搜索,似乎我不是第一个遇到这个问题的人,但我一直找不到任何人能够令人满意地解决它 - 我正在集成一个传统数据库,并且我只尝试与单个表进行集成(目前)但我的第一个对这个模型的查询需要大约12秒左右才能执行。但预计第二个调用将几乎立即完成。
以下是我整体的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;
我了解这个问题与元数据生成有关,这只需要进行一次,根据 ScottGu的评论,“可以大大提高性能”:
但是我描述的性能是否平均?我无法想象执行简单查询需要12秒钟的时间会被Entity Framework团队接受。我是否误解了他?元数据缓存是否在例如IIS应用程序池的生命周期内保持不变?这可能在某种程度上是可以接受的,虽然仍然不理想。“Code First”库使用与传统方法相同的EF作为其基础,因此性能特征应该大致相同。 “Code First”库还包括一些智能功能,以便对于从数据库映射/映射而来的元数据进行缓存-这样它只需要计算一次(这大大提高了性能)。
如果我不使用代码优先,那么我就可以使用EdmGen.exe生成我的视图,据我所知这会使我的应用程序更快。在使用代码优先开发模型时是否有相应的方法?
2012年2月14日更新: 多亏了Pawel的帖子,我能够生成我的视图。不幸的是,这并没有改变创建新PortalDatabase实例的速度,仍然需要同样长的时间。我知道视图正在被使用,因为我在构造函数中设置了断点,但这并不影响任何事情。