我们遇到了 Entity Framework 的问题,我们第一次在非常简单的对象插入上执行 SaveChanges 时,会有 2-4 秒的延迟。我已将其范围缩小(通过 ANTS Performance Profiler)以查看生成。我已经看过并关注了使用EdmGen或T4 模板预生成视图的文章,但这无济于事:.Views.cs 文件仅包含 SELECT 语句,而不包含 UPDATE 或 INSERT 语句。有很多关于 EF 和使用预编译查询、缓存查询等的性能的讨论,但它都集中在选择,而不是插入或更新,这些都隐藏在 SaveChanges() 后面。
我发现让 EF 生成 INSERT 视图的唯一方法是尝试在服务启动时插入我知道会失败的行,例如将外键设置为不应该存在的 ID。这在我看来绝对荒谬。有没有更好的办法?我真的不在乎它是否发生在编译时或服务启动时,但有没有办法强制 EF 生成所有(基本)UPDATE 和 INSERT 视图?让服务的第一个用户等待 2-4 秒以插入单行是不可接受的。
我们现在正在使用 EF 4,但如果需要解决此问题,我们将跳转到 EF 5 和 .NET 4.5。
编辑:进一步调查表明,虽然在创建/编译更新视图时第一次在表上调用 SaveChanges() 时存在开销,但可以忽略不计(30-40 毫秒)。由于巨大的调用堆栈,对其进行分析使它看起来比实际情况更糟。我最初的 2-4 秒时间最终分解为其他开销,例如:创建第一个上下文:1600 毫秒第一个 EF 操作(加载或创建查询视图)如果预编译,则为 400 毫秒,否则为 3000 + 毫秒初始连接到远程数据库:500 毫秒