我很欣赏这个问题之前已经提出了几次,但我找不到明确的答案(也许没有一个!)。
无论如何,标题真的告诉了一切。创建一个新的上下文,添加一个新实体,SaveChanges()需要20秒。在同一个上下文中添加第二个实体,SaveChanges()即时。
对此有何想法? : - )
============更新=============
我创建了一个非常简单的应用程序,针对我现有的模型运行以显示问题...
public void Go()
{
ModelContainer context = new ModelContainer(DbHelper.GenerateConnectionString());
for (int i = 1; i <= 5; i++)
{
DateTime start = DateTime.Now;
Order order = context.Orders.Single(c => c.Reference == "AA05056");
DateTime end = DateTime.Now;
double millisecs = (end - start).TotalMilliseconds;
Console.WriteLine("Query " + i + " = " + millisecs + "ms (" + millisecs / 1000 + "s)");
start = DateTime.Now;
order.Note = start.ToLongTimeString();
context.SaveChanges();
end = DateTime.Now;
millisecs = (end - start).TotalMilliseconds;
Console.WriteLine("SaveChanges " + i + " = " + millisecs + "ms (" + millisecs / 1000 + "s)");
Thread.Sleep(1000);
}
Console.ReadKey();
}
请不要评论我的代码 - 除非是无效的测试;)
结果是:
查询1 = 3999.2288ms(3.9992288s)
SaveChanges 1 = 3391.194ms(3.391194s)
查询2 = 18.001ms(0.018001s)
SaveChanges 2 = 4.0002ms(0.0040002s)
查询3 = 14.0008ms(0.0140008s)
SaveChanges 3 = 3.0002ms(0.0030002s)
查询4 = 13.0008ms(0.0130008s)
SaveChanges 4 = 3.0002ms(0.0030002s)
查询5 = 10.0005ms(0.0100005s)
SaveChanges 5 = 3.0002ms(0.0030002s)
第一个查询需要时间,我假设是视图生成?还是db连接?
第一次保存需要将近4秒,对于我的应用程序中更复杂的保存需要超过20秒,这是不可接受的。
现在不知道该怎么做: - (
... UPDATE
SQL事件探查器显示第一个查询和更新速度很快,并且首先没有区别。所以我知道延迟是实体框架的怀疑。
答案 0 :(得分:3)
它可能不是SaveChanges调用 - 第一次在EF中对数据库进行任何调用时,它必须从元数据中生成一些初始代码。您可以在编译时预生成:http://msdn.microsoft.com/en-us/library/bb896240.aspx
如果这是唯一的问题我会感到惊讶,但它可能会有所帮助。
答案 1 :(得分:0)
我会在app启动时运行以下代码,看看它需要多长时间,如果之后第一个SaveChanges很快。
public static void UpdateDatabase()
{
//Note: Using SetInitializer is reconnended by Ladislav Mrnka with reputation 275k
//http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start
Database.SetInitializer<DAL.MyDbContext>(
new MigrateDatabaseToLatestVersion<DAL.MyDbContext,
Migrations.MyDbContext.Configuration>());
using (var db = new DAL.MyDbContext()) {
db.Database.Initialize(false);//Execute the migrations now, not at the first access
}
}