Entity framework DbContext.Entry性能问题

Entity framework DbContext.Entry性能问题,entity-framework,dbcontext,entity-framework-5,Entity Framework,Dbcontext,Entity Framework 5,继Julia Lermas的书《DbContext》中关于跟踪更改的N层解决方案之后,我为每个实体提供了一个状态属性和一个OriginalValues字典(通过IObjectWithState)。构造实体后,我将原始值复制到此字典。参见本书的样本(4-23): public BreakAwayContext() { ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += (sender, args) =>

继Julia Lermas的书《DbContext》中关于跟踪更改的N层解决方案之后,我为每个实体提供了一个状态属性和一个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?

上下文。Entry()调用
DetectChanges()
,这取决于上下文中对象的数量,可能非常慢。在您的情况下,您可以用更快的版本
((IObjectContextAdapter)ctx)替换

您是否尝试过她的其他建议,即存储更改值列表?我认为存储原始值会很昂贵,因此在我的多层(多平台)解决方案中,我存储了一个包含更改属性的逗号分隔列表(在Delphi中,首先使用.Net中的T4模板覆盖Delphi中每个属性的设置器)。在DAL中,当发送实体(或DTO)进行更新时,我循环并将每个更改的属性标记为已修改。这并不能解释一种更快地检索原始值的方法,但它将实现断开连接的更改跟踪。谢谢!我刚刚换掉了我的代码来使用你的替代方法。从8秒到0.0030秒,我的手机会收到状态呼叫!从4秒到几乎0秒的状态呼叫!我使用了((IObjectContextAdapter)ctx.ObjectContext.ObjectStateManager.GetObjectStateEntry(obj).ChangeState(EntityState.Modified);