DbSet.Load()方法太慢了

时间:2014-05-31 13:42:30

标签: wpf performance entity-framework sqlite code-first

我有一个SQLite数据库,其中包含一个名为" Main"的表。该表的每条记录只包含两个字段:ID(整数,主键)和名称(字符串)。数据库中有100条记录。

使用Entity Framework Power Tools我已经从现有数据库创建了Code First模型。该模型相当简单:

// MainMap.cs
public class MainMap : EntityTypeConfiguration<Main>
{
    public MainMap()
    {
        // Primary Key
        this.HasKey(t => t.ID);

        // Properties
        this.Property(t => t.name)
            .IsRequired()
            .HasMaxLength(50);

        // Table & Column Mappings
        this.ToTable("Main");
        this.Property(t => t.ID).HasColumnName("ID");
        this.Property(t => t.name).HasColumnName("name");
    }
}

// Main.cs
public partial class Main
{
    public long ID { get; set; }
    public string name { get; set; }
}

// mainContext.cs
public partial class mainContext : DbContext
{
    static mainContext()
    {
        Database.SetInitializer<mainContext>(null);
    }

    public mainContext()
        : base("Name=mainContext")
    {
    }

    public DbSet<Main> Mains { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MainMap());
    }
}

现在我试图从数据库中获取记录:

mainContext context = new mainContext();
context.Mains.Load();

现在,我可以将context.Mains.Local用于不同目的(实际上,我将其绑定到ListView&#39; s ItemsSource)。

问题是context.Main.Load()行执行了大约2.7秒。我认为,从简单的数据库中检索大约100条记录的时间太长了。虽然,我是数据库的新手,所以,也许我不对,2.7秒是相当合适的一段时间。我的CPU是Intel i3-3220(2x3.30 GHz),Entity Framework的版本是6.0。

也许,我的Code First模型很差,或者EF没有提供高性能,或者可能没有必要调用Load()方法来获取记录(但如果我不这样做的话)叫它,context.Mains.Local是空的。)

那么,如何提高从数据库中获取记录的性能呢?

任何帮助和提示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我用SQLite和SQL Server运行了一些测试。在我的笔记本电脑(corei7 2630QM 2.00GHZ&amp; win7 64bit)上,两者的加载时间约为1.5秒。 然后我试着用类似

之类的东西加热
context.Database.Exists();

两者的时间减少到约700毫秒。

我在项目属性的构建选项卡中使用了“Prefer 32-bit”和“Optimize code”选项。这些选择产生了最好的结果。

尝试这些并查看加载时间是否发生变化。