モデルオブジェクトのリストで更新操作を実行する必要があります。 現在、私はそれらをループしながら更新することができます。Entity Frameworkコードファーストアプローチ - Updaterange()を実行します
リストをループせずにリストを更新できる直接的な方法はありますか?
モデルオブジェクトのリストで更新操作を実行する必要があります。 現在、私はそれらをループしながら更新することができます。Entity Frameworkコードファーストアプローチ - Updaterange()を実行します
リストをループせずにリストを更新できる直接的な方法はありますか?
あなたが探しているのはバルク操作のようです。 Entity Frameworkは一括操作には適していません。 EFが追跡しなければならない変更の数が増えると、パフォーマンスが低下します。
いくつかの可能な回避策があります:あなたが更新しているリストを列挙として
は間隔の変更をコミットします。コンテキスト内に1000個以上のアイテムを挿入または更新した後は、SaveChanges
となります。
EFで追跡されるアイテムが多くなるほど、より難しいEFが機能します。これの一部はオプション1で軽減されますが、トラッキングを無効にすることもできます。公正な警告、これにいくつかのキャッチがありますので、変更の検出を無効にするときに考慮する必要があるすべてのものを確実に読み上げてください。
大量の変更が必要な場合は、EFよりもストアドプロシージャを使用する方がよい場合があります。
注:オプション1の1000個のアイテムは任意の数です。このルートを選択する場合は、テストを実行して、使用しているオブジェクトに最も適した範囲を確認する必要があります。あなたが見つける何
は次のとおりです。
listSize
n
それは、よりアイテムのn
番号の後にSaveChanges
を呼び出すためにはるかに高速です 1〜listSize
各項目の後にSaveChanges
と呼んでください。 listSize
が数万回または数十万回の更新の場合、n
はおそらくlistSize
未満です。目標は、n
という値を見つけて、リスト全体を最速で更新できるようにすることです。
*ループせずに*なぜですか? –
いいえ、ありません。ループしないでいくつのエントリーを変更すればよいでしょうか? ChangeTrackingを有効にした状態でエントリーがコンテキストにアタッチされている間にそれを行うと、後で変更するように設定する必要はありません。コンテキストを再追加する前にコンテキストから切り離すと...もちろん、EFにコンテキスト内のオブジェクトの処理方法を伝える必要があります。挿入するオブジェクトと更新するオブジェクトを推測することはできません。 – DevilSuichiro
さらに別の "thru"と私は "through"を "thru"してウィンドウを開きます:-) – peterh