2012-08-22 74 views
2

在我的ASP.NET MVC WebApi項目中,我有一個Repository(帶接口),它通過一個簡單的Linq SingleOrDefault命令查詢數據庫,然後將所有內容輸出到控制器。 (EF =數據庫首先針對Oracle數據庫)ASP.NET MVC WebApi&EF懶加載=永久加載?

問題是,當我打開延遲加載(通過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視圖中使用延遲加載功能,我將不勝感激。

我的工作圍繞的時刻是將延遲加載關閉(db.ContextOptions.LazyLoadingEnabled = False)用於通過電話的WebAPI ...

+0

你可以發佈'MEDIEN'類型的定義嗎?你使用哪個客戶端(GET,AJAX,fiddler等)? – nemesv

+0

MEDIEN是我的Oracle DB中的一個數據庫表,具有各種列和數據類型。我使用過所有主流瀏覽器和提琴手來調用API,所有結果都一樣。 – stare

回答

1

鑑於你所描述的行爲,我懷疑懶加載造成(由於某種原因)的從數據庫加載大量數據,這需要很長時間,看起來沒有響應。關閉延遲加載確保只返回查詢的第一個「級別」,而不填充任何集合屬性。

如果這些調用是針對WebAPI的,我不確定您會從延遲加載中獲得任何真正的好處。 API調用在查詢數據庫和返回嚴格定義的結果集的方式上應該是非常確定的。編寫一個運行良好的API很難(只需詢問StackOverlow團隊!)並且查詢性能至關重要。

+0

我也沒有看到使用Web API的延遲加載沒有真正的好處,但它確實有助於MVC部件,特別是在處理主/細節場景時。你有沒有建議如何關閉所有API存儲庫的功能,但不適用於MVC應用程序中使用的功能? (FFunny thig仍然認爲通過控制檯應用程序的調用速度非常快......) – stare

+0

您應該能夠爲每個存儲庫實例設置延遲加載選項,以便MVC應用程序啓用它,但WebAPI調用將其禁用。從WebAPI調用時是否啓用延遲加載來調試/分析執行? –

+0

好像我需要堅持禁用每個WebApi存儲庫的New構造函數中的延遲加載! (順便說一下:我經歷了幾次,並且按照您的建議,似乎在導航設備/外鍵方面存在問題)。感謝您的幫助! – stare