2016-09-23 48 views
0

任何人都可以發佈正確和有用的MVC應用程序中使用EF延遲加載的示例嗎?在MVC應用程序中使用EF延遲加載的實例

我試圖研究這個問題,但我無法得到正確的案例。

因此,我的結論是:由於Web應用程序是無狀態的,因此將LL包含到實體中是沒有意義的。但這聽起來很奇怪。這就是爲什麼問題在這裏。

您能證實或反駁我的結論嗎?

編輯

問題方面的statment 「無狀態」 在我心目中很重要的。讓我們假裝2場景。第一個例子涉及WPF應用程序,第二個涉及MVC。假設這是下一個簡單對象:

public class Person 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    ... 
    public virtual List<Activity> Activities { get; set; } 
} 

1)WPF。用戶可以請求沒有他的活動的唯一人員。因此他得到了一小部分數據。開銷是合理的。同時用戶可以決定請求人的活動。 由於ll機制,EF只需加載活動而不需要再次請求人員對象,因爲Person仍然存在於應用程序中(當然,如果我們以這種方式編寫代碼)。

2)MVC。同樣的行動在那裏。但唯一的區別是,在服務器響應之後,包括對象Person在內的所有資源都被部署。我們無法像在WPF應用程序中那樣加載Person活動。我們被迫再次加載Person(與WPF應用程序相比,開銷增加了)

問題是隻有在實體所連接的上下文範圍內才能執行延遲加載 - 如果處置上下文,則不能用它。

+0

請參閱此鏈接:http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading –

+0

你能仔細閱讀這個問題嗎?你的鏈接根本沒有回答。 m知道什麼是懶惰加載,但我想知道是否有任何在web應用程序中使用它的合理情況。 – managerger

+0

請參閱這篇文章:https://auth0.com/blog/12-steps-to-a-faster -web-app/ –

回答

2

我不認爲你明白什麼是懶加載,因爲它與是否有任何狀態無關。這不像緩存或什麼。延遲加載只是實體框架重載一個屬性來添加一個自定義的getter,當第一次訪問該屬性時,它會發出一個查詢來獲取該對象或一組對象。

舉例來說,如果你有這樣的事情:

public class Foo 
{ 
    public virtual Bar Bar { get; set; } 
} 

而且你要查詢一組從數據庫Foo秒,Bar財產上所有的人都將是零,因爲EF不會有發出任何疑問以獲取相關的Bar實例。但是,如果要遍歷Foo的此列表並訪問Bar(即foo.Bar.Baz)上的某個屬性,則EF將爲Bar實例發出一個即時查詢,以便它可以返回Baz屬性。

+0

你可以看看編輯部分有問題嗎? 希望你能明白我的觀點,提前致謝! – managerger

+0

我認爲他意味着網絡的無狀態和事實,即每個請求將要實例化控制器和相應的上下文。 – Fran

+0

@fran,是的,老兄,你明白了,讓我們發表你的想法回答一個問題)謝謝) – managerger