Asp.net mvc ASP.NET MVC WebApi&;EF延迟加载=永久加载?

Asp.net mvc ASP.NET MVC WebApi&;EF延迟加载=永久加载?,asp.net-mvc,linq,entity-framework,asp.net-web-api,Asp.net Mvc,Linq,Entity Framework,Asp.net Web Api,在我的ASP.NET MVC WebApi项目中,我有一个存储库(带有接口),它通过一个简单的Linq SingleOrDefault命令查询数据库,然后将所有内容输出到控制器。(EF=数据库优先于Oracle DB) 问题是,当我打开延迟加载(通过EDMX文件属性)时,get将永远加载,并且没有响应。如果我关闭惰性加载,一切正常吗 更奇怪的是,当我将所有查询放在控制台应用程序中,并通过console.WriteLine输出所有内容时,它是否也适用于延迟加载 界面: Public Interfa

在我的ASP.NET MVC WebApi项目中,我有一个存储库(带有接口),它通过一个简单的Linq SingleOrDefault命令查询数据库,然后将所有内容输出到控制器。(EF=数据库优先于Oracle DB)

问题是,当我打开延迟加载(通过EDMX文件属性)时,get将永远加载,并且没有响应。如果我关闭惰性加载,一切正常吗

更奇怪的是,当我将所有查询放在控制台应用程序中,并通过console.WriteLine输出所有内容时,它是否也适用于延迟加载

界面:

Public Interface IMedienRepository
    Function [Get](id As Integer) As MEDIEN
End Interface
存储库

Private db As EFEntities
Public Sub New()
    db = New EFEntities
End Sub

Public Function [Get](id As Integer) As MEDIEN Implements IMedienRepository.[Get]
    Dim _medien = db.MEDIEN.SingleOrDefault(Function(m) m.MEDIENNR = id)

    If _medien Is Nothing Then
        Throw New NotFoundException()
    End If

    Return _medien.SingleOrDefault()
End Function
控制器

Private _repository As IMedienRepository
Public Sub New()
    Me.New(New MedienRepository())
End Sub
Public Sub New(repository As IMedienRepository)
    _repository = repository
End Sub

Public Function GetValue(id As Integer) As MEDIEN
    Try            
        Return _repository.Get(id)
    Catch generatedExceptionName As NotFoundException
        Throw New HttpResponseException(New HttpResponseMessage() With { _
         .StatusCode = System.Net.HttpStatusCode.NotFound _
        })
    End Try
End Function
仅供参考:即使我将查询直接放入控制器,它也不起作用

如果有人知道这个问题并能帮助我,我将不胜感激,因为我喜欢在MVC视图中使用延迟加载特性


目前我的工作是关闭通过WebApi调用的延迟加载(
db.ContextOptions.LazyLoadingEnabled=False
)。

鉴于您描述的行为,我怀疑延迟加载导致(出于某种原因)从数据库加载大量数据,这需要很长时间,看起来没有响应。关闭延迟加载可确保只返回查询的第一个“级别”,而不填充任何集合属性


如果这些调用是针对WebAPI的,我不确定您是否会从延迟加载中获得任何真正的好处。API调用查询数据库和返回严格定义的结果集的方式应该非常确定。编写一个性能良好的API很难(只需询问StackOverlow团队!),而查询性能也很关键。

您能否发布类型定义
MEDIEN
?GET使用哪个客户机(AJAX、fiddler等)?MEDIEN是我的Oracle DB中的一个数据库表,具有各种列和数据类型。我使用了所有主要的浏览器和fiddler来调用API,都得到了相同的结果。我也没有看到在Web API中使用延迟加载的真正好处,但它在MVC部分确实有帮助,特别是在处理主/细节场景时。您对如何关闭所有API存储库(而不是MVC应用程序中使用的存储库)的功能有什么建议吗?(有趣的是,通过控制台应用程序调用的速度仍然非常快……)您应该能够设置每个存储库实例的延迟加载选项,以便MVC应用程序启用它,而WebAPI调用禁用它。您是否在通过WebAPI调用时调试/分析了启用延迟加载的执行情况?似乎我需要坚持在每个WebAPI存储库的新构造函数中禁用延迟加载!(顺便说一句:我试了几次,它似乎在导航属性/外键方面有问题,就像你建议的那样。)谢谢你的帮助!