2017-01-07 6 views
0

私はEntity Frameworkで構築されたアプリケーションを持っています。エンティティはvirtualのナビゲーションプロパティを持ちます。これは遅延読み込みを意味します。すべてが機能していますが、私はパフォーマンスの問題に気付きました。SQL Server CEのEntity Framework - 遅延ロードとパフォーマンスの考慮事項

一部のプロパティで遅延ロードすると、データベースに複数のクエリが発生します。例えばI .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 Serverに対して実行したときに、(遅延ロード対熱心な)2つのシナリオが同じ性能を与えるので、私は本当に、SQL CEに問題を絞り込んています。

答えて

1

アプリケーションの起動コードでデータベースへの接続を開き、アプリケーションの存続期間中は開いたままにします。データアクセスにこの接続を使用しないでください。 これは、SQLコンパクトファイルを開き、起動時(起動時のみ)にSQLコンパクト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

関連する問題