2015-11-10 19 views
1

我試圖在我的應用程序中診斷嚴重的性能問題。這已經差不多一個星期了,我不確定是什麼原因造成的,除了今天我注意到下面的「Loaded」EntityFrameworkDynamicProxies'這一行持續了將近2分鐘。這是什麼?爲什麼它如此之慢,以及如何能夠我改進呢?實體框架掛載在加載的DynamicProxy上

enter image description here

回答

0

當創建POCO實體類型的實例中,實體框架經常創建充當實體的代理動態生成的派生類型的實例。此代理將覆蓋一些虛擬屬性實體在訪問屬性時自動插入用於執行動作的鉤子,例如,該機制用於支持關係的延遲加載

來源:Data Developer Center

您可以通過在DbContext構造函數設置此行this.Configuration.ProxyCreationEnabled = false;禁用它。

如果禁用,當現有代碼依賴Lazy Loading加載相關數據時,您可能會在應用程序某處遇到某些問題。您必須通過使用Explicit LoadEager Load來解決這些問題。通過使用您DbSetInclude方法類似db.Persons.Include(p => p.Cars).Include(p => p.Pets).Include(p => p.Children).Where(p => p.Id == personId);

  • 顯式加載利用變更跟蹤和Load方法您進入這樣

    • 預先加載:或db.entry(person).Collection(p => p.Cars).Load();收集的導航性能db.entry(person).Property(p => p.Home).Load();進行簡單的導航屬性。

    延遲加載,顯式加載或預先加載,如果您沒有正確使用EF,沒有改善應用程序性能的靈丹妙藥。有些東西在你的代碼進行檢查,以確保您有:

    • 使用ToList()ToArray()等..只有一次執行查詢,並禁止對數據庫進行同樣的要求時,你需要重申的查詢。
    • 不在客戶端過濾。我的意思是確保在向數據庫發送查詢之前使用正確的過濾器創建查詢。
    • 如果您看到EF生成的SQL效率不高,則爲查詢創建SQL視圖。複製生成的SQL並分析SSMS上的執行計劃。

    有很多事情可以根據你的應用程序在做什麼,需要加以改進。您可以使用緩存,以避免未來的請求等...

  • +0

    我有惰性加載和代理創建都禁用在我的dbcontext和當前使用.Include()這就是爲什麼這是如此令我困惑。我應該啓用延遲加載嗎?另外我還看到EF包含速度非常慢,這可能是我應該注意的問題。 – devfunkd

    +0

    我編輯了我的答案。 – CodeNotFound