2009-10-02 11 views
11

エンティティフレームワークを使用するようにアプリケーションを書き直しています。私が混乱しているのは、SQL Serverの不要なtriptsを作成しているような、私が書いているコードです。たとえば、私はSOに似た質問回答サイトを持っています。質問に回答を追加すると、ここに私が使用するコードがあります:Entity Frameworkがデータベースに多くの往復を行うのはなぜですか?

上記のコードでは、2つのデータベース呼び出しが正しく行われていますか?もしそうなら、質問に直接答えを加えることができないのはなぜですか?

var ans = answer.Createanswer (0, "title here", "desc here", questionID) 
context.SaveChanges(); 

すべてのデータベース呼び出しを最小限に抑える方法はありますか?

+1

良い質問... –

答えて

11

EFデザイナーhttp://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

のAlexJ 1で説明したようにまたこれは、すべてのそれは単純なアプローチを使用して

だようでないことが多いのように、単純な「最適化」の分野に該当しますSQLはFK(質問)を読み込み、その結果をキャッシュするために読み込み操作を行い、次にキャッシュされたFK結果を使用する必要がある挿入操作を実行します。

添付のFKメソッドを使用すると、サーバーがFKの読み取り操作を実行している場合は、SQL Serverへの往復が1つ少なくなります。時間が経つにつれて、複雑なコードの複雑さよりも往復が高価になるのですか?

FKはIOのオーバーヘッドが、それがある場合よりもはるかに多くのことができる大規模またはワイドテーブルにクラスタ化インデックスの場合は、アプリケーションとSQL Serverは、このオーバーヘッドはまた、非常に小さな

ある同じマシン上にある場合ちょうどFK値に別々の標準的な指標 - SetEntityKeyを呼び出すときに、クエリオプティマイザは、明示的な を避けるために

-3

これは実行できますが、.NET 3.5では非常に苦労しています。彼らはこれを.NET 4.0でもっと簡単にしました。

8

実際に関係を設定するために質問を読み込む必要はありません。代わりに、EntityReferenceだけを使用できます。

それは代わりに次のようになりますので、私は個人的に

public static void SetEntityKey<T>(this EntityReference value, int id) 
{ 
    value.EntityKey = new EntityKey("ContextName." + typeof(T).Name, "Id", id); 
} 

をエンティティキーを設定するための拡張メソッドを使用し

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.EntityKey 
    = new EntityKey("MyContextName.Question", "Id", questionId); 

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.SetEntityKey<Question>(questionId); 
+0

はあなたが使用することはできません「この実体参照」:-)正しく動作していると仮定? – devio

関連する問題