ASP.NET MVC WebApi& EF Lazy Loading =永远加载?

时间:2012-08-22 14:30:20

标签: asp.net-mvc linq entity-framework asp.net-web-api

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

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

更奇怪的是,当我将所有查询都放在控制台应用程序中并通过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)以进行呼叫...

1 个答案:

答案 0 :(得分:1)

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

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