Entity framework Owin-慢速兼容模型调用

Entity framework Owin-慢速兼容模型调用,entity-framework,asp.net-web-api,asp.net-web-api2,owin,azure-mobile-services,Entity Framework,Asp.net Web Api,Asp.net Web Api2,Owin,Azure Mobile Services,Azure移动应用程序Web API的ApiController请求中包含以下代码行: 以下是应用程序洞察的结果: 我们可以看到,虽然代码行花费了2613ms,但对数据库的实际查询调用却花费了190ms。虽然这是一种边缘情况,但经常发生的情况足以让用户抱怨性能低下。 问题是,我不知道这种差异是从哪里来的。注意,这不是因为冷启动,当这个确切的呼叫发生时,应用程序是热的。 第二行是对数据库端点的实际调用。在此之前,它与数据库无关 ps:该图来自应用程序洞察。它们捕获对数据库的调用,我通过Trac

Azure移动应用程序Web API的ApiController请求中包含以下代码行:


以下是应用程序洞察的结果:



我们可以看到,虽然代码行花费了2613ms,但对数据库的实际查询调用却花费了190ms。虽然这是一种边缘情况,但经常发生的情况足以让用户抱怨性能低下。

问题是,我不知道这种差异是从哪里来的。注意,这不是因为冷启动,当这个确切的呼叫发生时,应用程序是热的。

第二行是对数据库端点的实际调用。在此之前,它与数据库无关

ps:该图来自应用程序洞察。它们捕获对数据库的调用,我通过
TrackDependency
方法添加onwn数据

更新

今天,得益于Application Insights采样(很棒的工具!),我获得了更多的数据。 以下是结果(这不是确切的请求调用实例,但这是相同的问题):

它清楚地表明
context.Database.CompatibleWithModel(false)
是罪魁祸首。通过调用
IDatabaseInitializer
的自定义实现的
InitializeDatabase
调用它。我的自定义初始化器设置为
启动

我在SOF上发现了另一个未回答的问题,

为什么要花这么长时间?

InitializeDatabase
并不总是被调用,我不知道何时被调用以及为什么被调用。

我发现了另一个罪犯:

现在我们看到,
EntityConnection.Open
正在等待一些东西。连接上有锁吗?到目前为止,尚未调用数据库端点,因此我们仍在这里使用
EntityFramework

更新2

这篇文章有两个问题:

  • 为什么
    兼容模型
    速度慢?有很多关于启动时间改进的文章。这不是那个问题所要解决的
  • 为什么是
    EntityConnection.Open
    阻塞。这与EntityFramework无关,但通常用于获取连接,如果在5分钟的窗口内未调用该连接,则最多需要3秒钟。我在一个特定的场合提出了这个问题


因此,在这篇文章中没有更多的问题,这些问题可以删除,但作为跟踪Web Api调用中丢失的时间的分析可能仍然有用。

这是服务器端的吗?在API或表控制器中?怎么叫它?移动应用程序和服务器之间的延迟是多少?您没有提供足够的信息进行诊断。我怀疑当你有足够的信息时,你就会知道效率低下的地方。通常在LINQ to SQL部分(实体框架的一部分)中,Azure移动应用程序和SQL数据库都位于同一Azure区域内吗?@chris在这种情况下没有。但第二行持续时间是对数据库端点的整个调用。当它位于同一区域时,不需要190毫秒,而是需要8毫秒。问题是调用db端点之前的时间。它位于EF和linq之间sql@AdrianHall它是一个ApicController,图形来自门户上的应用程序洞察,因此它是服务器端。它的调用方式以及应用程序和服务器之间的延迟与IMHO无关,除非对问题进行了很好的隔离。不幸的是,我不太了解EF6或SQL Server驱动程序,因此无法在这里发表评论。Azure移动应用程序在可用的地方对SQL实例(我猜是SQL Azure)使用端到端加密。这是服务器端吗?在API或表控制器中?怎么叫它?移动应用程序和服务器之间的延迟是多少?您没有提供足够的信息进行诊断。我怀疑当你有足够的信息时,你就会知道效率低下的地方。通常在LINQ to SQL部分(实体框架的一部分)中,Azure移动应用程序和SQL数据库都位于同一Azure区域内吗?@chris在这种情况下没有。但第二行持续时间是对数据库端点的整个调用。当它位于同一区域时,不需要190毫秒,而是需要8毫秒。问题是调用db端点之前的时间。它位于EF和linq之间sql@AdrianHall它是一个ApicController,图形来自门户上的应用程序洞察,因此它是服务器端。它的调用方式以及应用程序和服务器之间的延迟与IMHO无关,除非对问题进行了很好的隔离。不幸的是,我不太了解EF6或SQL Server驱动程序,因此无法在这里发表评论。Azure移动应用程序在可用的情况下对SQL实例使用端到端加密(我猜是SQL Azure)。
var user = t.TrackDependency(() => context.Users.SingleOrDefault(x => x.Email == loginRequest.Id || x.Name == loginRequest.Id), "GetUser");