9

遵循 Julia Lermas 的关于跟踪更改的 N 层解决方案的“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);
      }
    };
}

在 BreakAwayContext(继承自 DbContext)的构造函数中,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 回答