[解決済み] EF 4.1のエンティティの挿入は、ObjectContextに比べてなぜそんなに遅いのですか?
質問
基本的に、私は1つのトランザクション内で35000のオブジェクトを挿入します。
using(var uow = new MyContext()){
for(int i = 1; i < 35000; i++) {
var o = new MyObject()...;
uow.MySet.Add(o);
}
uow.SaveChanges();
}
これには時間がかかる!
もし私が基礎となる
ObjectContex
t を使用すると (
IObjectAdapter
を使うことで)、まだ遅いですが20秒程度で終了します。見た目は
DbSet<>
が線形検索をしているようで、二乗の時間がかかっています...。
他にこの問題を見た人はいますか?
どのように解決するのですか?
コメントで Ladislav がすでに指摘しているように、パフォーマンスを向上させるには、自動変更検出を無効にする必要があります。
context.Configuration.AutoDetectChangesEnabled = false;
この変更検出は、デフォルトで
DbContext
API で有効になっています。
その理由は
DbContext
とは挙動が大きく異なる。
ObjectContext
の API は、より多くの機能が
DbContext
API が呼び出すのは
DetectChanges
の関数よりも内部的に
ObjectContext
APIよりも内部的に優れています。
ここで
を呼び出す関数のリストがあります。
DetectChanges
をデフォルトで呼び出す関数の一覧があります。それらは
-
は
Add
,Attach
,Find
,Local
またはRemove
のメンバーはDbSet
-
は
GetValidationErrors
,Entry
またはSaveChanges
のメンバーはDbContext
-
は
Entries
メソッドでDbChangeTracker
特に
Add
コール
DetectChanges
を呼び出し、これがパフォーマンスの低下の原因となっています。
これと対照的なのが
ObjectContext
のAPIコールは
DetectChanges
においてのみ自動的に
SaveChanges
のみであり
AddObject
といった、前述した対応するメソッドにはありません。そのため
デフォルト
の性能は
ObjectContext
の方が速いです。
なぜ、このデフォルトの自動変更検出を
DbContext
を導入したのでしょうか?よくわかりませんが、どうやらこれを無効にして
DetectChanges
を適切な箇所で手動で呼び出すことは
高度なものであり、アプリケーションに微妙なバグをもたらす可能性があるので、[it] は慎重に使用してください。
.
関連
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] タスクのResultプロパティにアクセスしようとすると、なぜこの非同期アクションがハングアップするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み] Entity Frameworkが遅すぎる。どうすればいい?[クローズド]