DbContext.Entry性能问题

时间:2012-10-04 09:20:18

标签: entity-framework dbcontext entity-framework-5

继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?

1 个答案:

答案 0 :(得分:14)

Context.Entry()调用DetectChanges(),它取决于上下文中的对象数量,并且可能非常慢。在您的情况下,您可以使用更快的版本((IObjectContextAdapter) ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(obj);

替换