实体框架Code-First非常慢

时间:2012-02-13 13:10:00

标签: sql-server-2005 entity-framework

从广泛的谷歌搜索,似乎我不是第一个遇到这个问题的人,但我一直找不到能够圆满解决它的人 - 我正在与遗留数据库集成,而我只尝试与单个表集成(此刻),但我对该模型的第一次查询大约需要12秒左右才能执行。第二次通话几乎是即时的,正如预期的那样。

以下是我的整个实体框架代码优先设置:

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“大大提高了性能”:

  

“代码优先”库使用与传统方法相同的底层EF - 因此性能特征应该大致相同。 “代码优先”库还包括一些智能,以便缓存用于映射到数据库/从数据库映射的元数据 - 这样它只需要计算一次(这可以大大提高性能)。

但我所描述的表现是平均水平吗?我无法想象执行简单查询需要12秒才能被Entity Framework团队接受。我误会了他吗?元数据缓存是否在例如IIS应用程序池的生命周期内持续存在?这可能在某种程度上是可以接受的,尽管仍然不太理想。

如果我没有先使用代码,那么我就可以use EdmGen.exe to generate my views,据我了解它会使我的应用程序更快。在使用代码开发我的模型时是否存在等价物?

2012年2月14日更新:感谢Pawel's post,我能够生成自己的观点。不幸的是,这并没有改变创建新PortalDatabase实例的速度,这仍然需要相同的时间。我知道正在使用视图,因为我在构造函数中放了一个断点,但这不会影响任何东西。

1 个答案:

答案 0 :(得分:2)

使用CodeFirst生成视图使用EF Power Tools。在此处查看更多详细信息:http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx