2017-01-07 85 views
0

我有一個使用Entity Framework構建的應用程序。實體具有導航屬性virtual,這意味着延遲加載。一切正常,但是,我注意到性能問題。SQL Server CE上的實體框架 - 懶惰vs渴望加載,性能考慮

某些屬性的延遲加載會導致對數據庫的多個查詢。例如如果我.Where(...)對10個項目的集合 - 它將生成10個額外的數據庫調用。假設這10個電話上的SQL time總共爲20ms。但是完成查詢所需的總時間要高得多。

如果我急於加載.Include(...),我看到類似的SQL time(即20ms),但操作完成得快得多。

我還沒有運行Profiler,但我懷疑瓶頸是打開和關閉SQL Server CE數據庫或其他類似的「基礎架構」操作。

我真的想使用懶加載,它使我的代碼更簡單。有沒有什麼辦法可以優化SQL Server CE連接,或者我有什麼辦法可以提高SQL Server CE的性能?

我的連接字符串現在

<add name="dataRepositoryConnection" 
    connectionString="Data Source=|DataDirectory|XXX.sdf" 
    providerName="System.Data.SqlServerCe.4.0" /> 

我這個問題真的縮小到SQL CE,因爲當針對SQL Server運行,這兩種情況(渴望VS懶加載)提供相同的性能。

回答

1

在應用程序啓動代碼中打開與數據庫的連接,並在應用程序的整個生命週期中保持打開狀態。請勿將此連接用於任何數據訪問。 這將打開SQL Compact文件並在啓動時(並且僅在啓動時)加載SQL Compact dll文件。

目前還不清楚,如果你的應用程序是一個Web應用程序或桌面應用程序,但你可以使用類似的代碼這一點,並從的Application_Start/App_Startup等:

public static class ContextHelper 
{ 
    private static ChinookEntities context ; 
    private static object objLock = new object(); 

    public static void Open() 
    { 
    lock (objLock) 
    { 
     if (context != null) 
      throw new InvalidOperationException("Already opened"); 
     context = new ChinookEntities(); 
     context.Connection.Open(); 
    } 
    } 
} 

稱它爲請參閱部署部分在我的博客張貼在這裏:http://erikej.blogspot.dk/2011/01/entity-framework-with-sql-server.html

+0

感謝您的回覆,它是一個WPF桌面應用程序。 –

+0

應用相同的代碼,只需從WPF中的App_Startup調用它即可 – ErikEJ