我们遇到了Entity Framework的问题,我们第一次在非常简单的对象插入上执行SaveChanges时,延迟时间为2-4秒。我把它缩小了(通过ANTS Performance Profiler)到View Generation。我已经看过并关注了使用EdmGen或T4 template预生成视图的文章,但这没有帮助:.Views.cs文件只包含SELECT语句,而不包含UPDATE或INSERT语句。围绕使用预编译查询,缓存查询等的EF和性能进行了大量讨论,但它们都围绕选择,而不是插入或更新,这些都隐藏在SaveChanges()之后。
我发现获取EF生成INSERT视图的唯一方法是尝试在服务启动时插入一行我知道会失败的行,例如将外键设置为永远不存在的ID。这对我来说似乎绝对荒谬。有没有更好的办法?我真的不在乎它是在编译时还是在服务启动时发生,但有没有办法强制EF生成所有(基本)UPDATE和INSERT视图?使服务的第一个用户等待2-4秒以插入单行是不可接受的。
我们现在正在使用EF 4,但如果有必要,我们将跳转到EF 5和.NET 4.5来解决此问题。
编辑: 进一步的研究表明,虽然是开销,但是在创建/编译更新视图时,第一次在表上调用SaveChanges()时,它可以忽略不计(30-40ms)。分析它使它看起来比由于巨大的调用堆栈更糟糕。我原来2-4秒的时间最终分解成其他开销,如: 创建第一个上下文:1600ms 第一个EF操作(加载或创建查询视图)如果预编译则为400毫秒,否则为3000 + ms 与远程数据库的初始连接:500ms
答案 0 :(得分:0)
进一步挖掘显示,与其他开销相比,生成更新视图的时间可以忽略不计,并且不需要任何特殊处理。