0

EF6 (6.0.1) を使用して INSERT を実行すると、本番環境が極端に遅くなります (30 ~ 120 秒)。Device と Trigger の間に多対多の関係があります。デバイスには仮想 ICollection があり、トリガーには仮想 ICollection があります。トリガーは、ほとんどの場合、静的テーブルです (現在は 1 行のみ)。新しいデバイスを作成する必要がある場合は、単一のトリガー行へのマッピングも作成する必要があります。そこで、その行をすばやく検索して、device.Triggers.Add() を実行します。しかし、EF6 が ObjectStateManager.UpdateRelationships や ObjectStateManager.TryUpdateExistingRelationships などの関数にドリルダウンするため、これには永遠にかかるようです。Trigger インスタンスの下にあるすべてのデバイスを更新していると想定しています。これを防ぐにはどうすればよいですか?私がやろうとしていることを行うためのより良い方法はありますか?

ありがとう、ティム

更新:わかりました、可能な回避策を見つけました。関係のトリガーからデバイスへの側を削除した場合 (つまり、トリガーから ICollection を削除した場合) は、実際には必要ないため、流暢な方法を使用して次のように設定します。

modelBuilder.Entity<Device>()
    .HasMany(x => x.Triggers)
    .WithMany()
    .Map(x =>
    {
        x.MapLeftKey("Device_Id");
        x.MapRightKey("Trigger_Id");
        x.ToTable("TriggerDevices");
    });

しかし、これを行う必要はないようです。誰でもこれに光を当てることができますか?

4

2 に答える 2

0

これが私の最初の投稿であることを受け入れてください - エチケットエラーについては申し訳ありません.

本番システムでも同じ問題が発生しました。解決策は、追加を逆にすることでした。

この例のために: -

Triggers には 1 行、Devices には 100,000 行があり、エンティティ フレームワーク コンテキスト オブジェクトは「db」と呼ばれます。</p>

トリガーに新しいデバイスを追加する場合は、

    var trigger = db.Triggers.Single(t => t.ID == <triggerID> );
    trigger.devices.add(newDevice);

ef は、オブジェクト トリガーの ICollection デバイス プロパティで変更追跡を実行できるように、デバイスのコレクション全体を読み込みます (1 つのトリガーに多数のデバイスが参加しています)。

ただし、newDevice.Triggers.add(exitingTrigger) を使用すると、ef はソースからデータをロードせず、変更追跡は newDevice が作成されることを認識し、ef が必要としていたとしても、リストには 1 つの項目しかありません。ソースをクエリします。

私は、EF のドキュメントでこれを見逃した数少ない人物の 1 人でしたか?

于 2014-03-06T14:46:14.827 に答える
0

データベースへのアクセスに時間がかかる場合は、通常、データベースが多くの作業を行っているのではなく、タイムアウトを待っているロックが原因です。

あなたはチェックすることができます:

  • データベースのロック。
  • SQL プロファイラーを使用して、データベースに送信している要求を確認します。
  • 接続文字列に「MultipleActiveResultSets = True」がありますか。これがない場合、ロックを説明できます。
于 2013-11-13T18:57:59.190 に答える