从广泛的谷歌搜索来看,我似乎不是第一个遇到这个问题的人,但我一直找不到能够令人满意地解决它的人 - 我正在与遗留数据库集成,我只是试图与单个表集成(目前),但我对该模型的第一次查询需要大约 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 的评论“大大提高性能”:
“代码优先”库使用与传统方法相同的底层 EF - 因此性能特征应该大致相同。 “代码优先”库还包括 aome smarts,以便缓存为映射到数据库或从数据库检索的元数据 - 这样它只需要计算一次(这大大提高了性能)。
但我所描述的表现是平均水平吗?我无法想象实体框架团队会接受花 12 秒执行一个简单查询。我是不是误会他了?元数据缓存是否在 IIS 应用程序池等的生命周期内持续存在?这在某种程度上可能是可以接受的,尽管仍然不太理想。
如果我不先使用代码,那么我就能够使用 EdmGen.exe 生成我的视图,据我了解,这将使我的应用程序变得更快。首先使用代码开发模型时是否有等效的方法?
2012 年 2 月 14 日更新: 谢谢帕维尔的帖子,我能够产生我的观点。不幸的是,这并没有改变创建新 PortalDatabase 实例的速度,仍然需要相同的时间。我知道正在使用视图,因为我在构造函数中放置了断点,但这不会影响任何内容。
要使用 CodeFirst 生成视图,请使用 EF Power Tools。请在此处查看更多详细信息:http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)