WebAPI中的Entity Framework: 首次查询缓慢

3
EF 6.0.1,code first,有两个表(父子关系)。我使用这个模型在WebAPI中查询数据,并将数据(约3KB)以JSON格式返回给网站(我还测试了最简单的“.FirstOrDefault()”查询——这里没有任何区别)。第一次访问WebAPI很慢(约10秒)。这与网站的启动无关,因为网站已经预热了。我通过ADO实现了相同的查询,第一次访问大约需要1秒钟。随后的请求显示Entity Framework惩罚明显减少(使用EF约为190ms,而使用ADO约为170ms)。我用本地SQL Server和Azure SQL进行了测试,结果类似。我对本地数据库进行了分析:没有什么特别的事情发生,所有的请求持续时间都是0。Entity Framework会生成其他查询来检查迁移,但这些查询非常精简。看着剖析输出,我注意到所有的数据库操作似乎都在大约一秒钟内发生,而整个EF初始化过程却花费了10秒钟。为什么?我已经在这里发现了一些提示,比如使用Release Mode并打开“Generate serialization”,但效果不是很好。在开始实施明显的解决方法之前(早期初始化EF或只是放弃EF),我希望还有其他要注意的问题。

尝试使用 Ngen,并使用 6,0,2。 - ErikEJ
我想补充一下,最近的一个项目中我使用了PetaPoco(http://www.toptensoftware.com/petapoco/),也尝试了NPOCO(https://github.com/schotime/NPoco),这是一个带有一些改进的分支。相比于我在EF上花费的努力,我认为这很轻松 - 但当然EF有其他功能。而且:没有任何启动延迟。如果你是一个“数据库优先”的开发者,你应该尝试其中的一个Micro-ORMs。Dapper(https://github.com/StackExchange/dapper-dot-net)具有更多的功能,并且该项目更加活跃,但由于其众多的功能,我还没有尝试过它。 - TvdH
1个回答

2
已知在Entity Framework 6.0.1版本中存在启动性能问题,尤其是在调试器附加的情况下。有关此问题的详细信息,请参见 Entity Framework Blog 。但是,由于EF6.0.2被标记为稳定版本,因此您的第一步应该是更新到使用它。
通常,在使用EF6与直接使用ADO进行查询时,始终会存在某些启动延迟,因为EF6需要加载与模型相关的内容,而直接使用ADO时则不需要这样做。然而,似乎在EF6.0.1上比正常情况更糟糕。

升级到6.0.2可能只获得了1秒钟的时间。我认为 - 如果我想使用EF - 我必须在用户等待结果之前调用MyContext.Database.Initialize(false)。由于EF没有在主页上使用,我可以在那里调用一个Web服务方法来执行此操作。然而,由于ASP.NET本身存在第一次访问惩罚(我通过监控服务规避了这种情况),如果此初始化发生在Application_Start中,那将是理想的。但这意味着将Web服务与Web应用程序耦合。 - TvdH
@kirsten:最终我用Peta Poco(http://www.toptensoftware.com/petapoco/)替换了EF,这个工具完美地完成了任务而且没有延迟。对于更大的项目和代码优先方法,我仍然使用EF。 - TvdH
@TvdH 实际上我删除了我的评论,因为我的问题最终并不是EF。 - Kirsten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接