Entity Framework 6の挿入順序を決定するロジック

c# entity-framework entity-framework-6 entity-framework-core

質問

だから、私はDBContextを持って、私は次の操作をしています:

dbContext.SomeTables1.Add(object1)
dbContext.SomeTables2.AddRange(objectArray2)
dbContext.SomeTables3.AddRange(objectArray3)
dbContext.SaveChanges();

EFは、この順序でdbレコードを挿入せず、ランダムな順序で挿入します。それらを同じ順序で挿入するには、追加するdbContext.SaveChanges()を実行する必要があります。これは効率的な解決策ではなく、私の場合は、すべての挿入を行うのに10秒かかりますが、1回の保存でランダムな順序は約3秒かかります。

NBデッドロックの問題を解決するには正しい順序が必要です。

私の質問は次のとおりです:

  • この問題はEF7で解決されていますか?
  • 私はEFをプロファイリングしてランダムな順序を決定することができますが、同じランダムな順序で一貫しているか、要求ごとに変化するという保証はありますか? (私はこの質問に対する答えが肯定的であれば私の他のコードを採用することができます)。
  • すべての追加でdbContext.SaveChanges()よりも順序を維持する良い方法はありますか?

受け入れられた回答

  • EF6またはEF7で保存オーダーを指定する方法はありません。
  • これは問題ではないため、EF7では問題は解決されません。
  • 前任者が同じであれば注文は同じになります(まれに起こることはほとんどありません)

SaveChangesを呼び出すと、すべてのエンティティがメソッド "ProduceDynamicCommands"の内部順序から順序付けされます。次に、 "TryTopologicalSort"メソッドによって再度ソートされます。これにより、先行するものが残っていないコマンドが追加されます(AとBを追加し、 Bの場合は、Aが挿入される前にBが挿入されます)

あなたはバッチ追加で挿入されます。

挿入を実行するのに3秒かかるので、何千ものエンティティがあると仮定し、一括挿入を実行するとパフォーマンスが向上し、10秒からそれ以下、さらには最初の3秒を短縮できます。

私が推薦できる2つの図書館はここにあります:

免責事項 :私はEntity Framework Extensionsプロジェクトのオーナーです。


人気のある回答

あなたはそれを使用する前にそれを注文することができますし、保存を使用する?助けてもらえませんか?



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ