Cha*_*ion 11 c# linq performance linq-to-entities entity-framework
我正在尝试减少基于EF的应用程序的启动时间,但我发现即使对于单实体上下文,我也无法将初始读取所花费的时间减少到7秒以下.特别奇怪的是,这个时间不是特定于上下文类型的.
任何人都可以解释是什么导致这些缓慢的时间和/或我如何让事情更快地运行?
这是完整的示例代码:
在我的数据库中,我有一个名为se_stores的表,其主键列为AptId:
// a sample entity class
public class Apartment
{
public int AptId { get; set; }
}
// two identical DbContexts
public class MyDbContext1 : DbContext
{
public MyDbContext1(string connectionString) : base(connectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext1>(null);
var config = new EntityTypeConfiguration<Apartment>();
config.HasKey(a => a.AptId).ToTable("se_stores");
modelBuilder.Configurations.Add(config);
base.OnModelCreating(modelBuilder);
}
}
public class MyDbContext2 : DbContext
{
public MyDbContext2(string connectionString)
: base(connectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext2>(null);
var config = new EntityTypeConfiguration<Apartment>();
config.HasKey(a => a.AptId).ToTable("apartments");
modelBuilder.Configurations.Add(config);
base.OnModelCreating(modelBuilder);
}
}
// finally, I run this code using NUnit:
var start = DateTime.Now;
var apt1 = new MyDbContext1(connectionString).Set<Apartment>().FirstOrDefault();
var t1 = DateTime.Now - start;
start = DateTime.Now;
var apt2 = new MyDbContext2(connectionString).Set<Apartment>().FirstOrDefault();
var t2 = DateTime.Now - start;
Console.WriteLine(t1.TotalSeconds + ", " + t2.TotalSeconds);
Run Code Online (Sandbox Code Playgroud)
它可靠地打印如下内容:7.5277527,0.060006.当我首先切换测试以使用MyDbContext2时,我得到相同的结果(因此无论DbContext首先被初始化,都会发生这种情况).我还尝试使用EF电动工具预生成视图.这将第一个环境的时间减少到大约6.8秒,因此只是一个小小的胜利.
我知道DateTime.Now是一个糟糕的分析方法,但是这些结果在使用dotTrace时仍然存在.我也知道第一次运行一些代码会调用JITing成本,但是7秒似乎太高而不能归因于此.
我在VS 2010中使用EF 4.3.1和.NET 4.
在此先感谢您的帮助!
编辑:有人建议打开SQL连接可能会导致问题.
编辑:我想知道延迟是每个连接还是只有一次.因此,我尝试将MyDbContext1和MyDbContext2连接到不同服务器上完全不同的数据库.无论首先连接哪个数据库,这个DID都没有区别:使用第一个DbContext需要大约7秒,而使用第二个上下文非常快.