9

変更を追跡する N 層ソリューションに関する Julia Lerma の著書「DbContext」に従って、各エンティティに State プロパティと OriginalValues ディクショナリを (IObjectWithState を介して) 提供しました。エンティティが作成されたら、元の値をこのディクショナリにコピーします。本のこのサンプル (4-23) を参照してください。

public BreakAwayContext()
{
  ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += (sender, args) =>
  {
      var entity = args.Entity as IObjectWithState;
      if (entity != null)
      {
        entity.State = State.Unchanged;
        entity.OriginalValues = BuildOriginalValues(this.Entry(entity).OriginalValues);
      }
    };
}

(DbContext から継承された) BreakAwayContext のコンストラクターで、ObjectMaterialized イベントがキャッチされます。エンティティの元の値を取得するには、this.Entry(entity) の呼び出しによってコンテキストから DbEntityEntry を取得します。この呼び出しにより、プロセスが遅くなります。このイベント ハンドラーの時間の 80% がこの呼び出しに費やされます。

元の値またはエンティティ DbEntityEntry を取得するより高速な方法はありますか?

4

1 に答える 1

16

Context.Entry() 呼び出しはDetectChanges()、コンテキスト内のオブジェクトの数に依存し、非常に遅くなる可能性があります。あなたの場合、より高速なバージョンに置き換えることができます((IObjectContextAdapter) ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(obj);

于 2013-09-11T20:46:28.413 に答える