簡體   English   中英

EF 5.0數據庫優先,POCO類型和延遲加載

[英]EF 5.0 Database first, POCO types and Lazy Loading

我不是數據庫專家,對EF來說還是很新。 我對FK關系上的延遲加載的不穩定行為感到困惑。

假設我有一個表Parent和一個表Children。 孩子的父母有非唯一的FK。 現在一些代碼:

Parent GetParent(int parentId)
{
    return Entities.Parents.Single(p => p.ParentId == parentId);
}

Child GetChildByName(int parentId, string name)
{
    var parent = GetParent(parentId);
    return parent.Children.Single(c => c.Name == name);   
}

現在,有時對parent.Children.Single的調用將失敗,因為序列Parent.Children為空。 並非總是如此 ,但有時也是如此 ,這使他們非常沮喪。 當它確實失敗時,我已經通過Intellitrace驗證了沒有執行任何SQL調用來獲取Children

此關系已在數據庫中正確創建,並且所有輸入參數均正確。 如果我使用Include("Children")並熱切加載所有Children,則每次都會正常工作。

如果在獲得父項之后但在為子項進行篩選之前將Thread.Sleep(1000)放入,則將不經常加載子項,並且調用成功。

因此,據我所知,這是一個與時間有關的問題。 FK關系不是按需加載的,但是它們似乎是在任意時間加載的。 我不了解這種行為,我認為我一定會丟失一些東西。

我真的不想在任何地方添加Include("SomeFK") ,因為它會使我的代碼更脆弱,實際上,為什么我必須這樣做? 如果我必須在我所在的位置撒滿電話以Include

A)常常不需要的數據B)編寫添加或刪除關系時必須編輯的代碼C)從ORM中獲得的收益不多(除了瑣碎的代碼生成)。 在這一點上,我也可能正在編寫原始SQL調用。

所以,是的,我肯定缺少一些東西,但是我已經找到了並且無法找到針對EF使用POCO類型(數據庫優先!)的延遲加載的全面說明。

我想知道這是否與您在Parent方法中擁有的Entities對象有關。 可能是Entities對象已放置或不可用,以便在抓住Parent對象時,孩子不是因為在延遲加載發生之前就已經放置了Entity?

如果您要在實體上下文范圍之外檢索對象,我建議使用這樣的代碼模式來顯式加載對象。 否則隨着上下文的消失,對象將無法延遲加載? 不是100%的原因,這就是為什么我總是在沒有DbContext對象可用的情況下返回記錄時顯式加載。

好的,這是我自己的愚蠢錯誤。 當然,該錯誤是在我的代碼中,而不是成千上萬的開發人員使用的庫。

我沒有在問題中提供足夠的信息。 我將忽略一些次要細節,但根本原因是競爭狀況。

我正在通過在線程A上創建的上下文創建/加載實體對象。然后將它們傳遞給后台處理新線程(B)並執行其任務的函數。 最終在線程B上執行對navigation屬性的調用。

通過閱讀文檔可以清楚地看到上下文不是線程安全的。 據我所知,EF正在對創建上下文的線程(即線程A)執行延遲加載。

這就是為什么Thread.Sleep()似乎“解決”了問題的原因; 線程B空閑了一秒鍾,而主線程有機會填充nav屬性。

在我們的代碼中,主線程正忙於在調用異步函數后立即執行一堆UI更新,因此它阻止上下文執行其操作。 同步執行所有操作就可以了。

希望這可以幫助某天遇到類似情況的人。 就像老話所說的那樣,RTFM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM