DbContext SaveChanges() - 检测更新的实体

时间:2011-11-14 20:40:17

标签: c# entity-framework savechanges dbcontext

我已经覆盖了Entity Framework 4.1 DbContext类中的SaveChanges()方法。

我的覆盖如下:

public override int SaveChanges() {

    IEnumerable<DbEntityEntry> modifiedEntityEntries = ChangeTracker.Entries().Where( e => e.State == EntityState.Modified );

    Debug.Assert( modifiedEntityEntries.Count() == 2 );

    int savedChanges = base.SaveChanges();

    Debug.Assert( savedChanges == 1 );

    // HELP! At this point, how do I tell Which of the two "Modified" entities actually updated a row in the database?

    return savedChanges;

}

假设上下文中有2个实体,并且都标记为Modified(EntityState.Modified)。其中一个已被修改,并且与底层数据库行不同。另一个实际上与底层数据库行不同,它只是标记为这样。

如何在调用SaveChanges()之后告诉两个实体中哪一个实际更新了数据库中的一行,哪一个实际上没有真正修改过呢?

1 个答案:

答案 0 :(得分:3)

这就是我们编写代码的方式。启用了延迟加载和代理创建。

请注意,与启用代理创建时相比,EF会知道哪个属性已更改,您无需转到数据库。 EF不知道的唯一地方是,是否有其他上下文改变了行(并发错误),以避免使用RowVersion列/属性

在构造函数中:

  public DataContext()
            : base()
  {
      this.Configuration.ProxyCreationEnabled = true;
      this.Configuration.LazyLoadingEnabled = true;
      var objectContext = ((IObjectContextAdapter)this).ObjectContext;
      objectContext.SavingChanges += new EventHandler(objectContext_SavingChanges);
  }

  private void objectContext_SavingChanges(object sender, EventArgs e)
  {
      var objectContext = (ObjectContext)sender;
      var modifiedEntities =
            objectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added
            | System.Data.EntityState.Modified);

      foreach (var entry in modifiedEntities)
      {
          var entity = entry.Entity as BusinessBase;
          if (entity != null)
          {
              entity.ModDateTime = DateTime.Now;
              entity.ModUser = Thread.CurrentPrincipal.Identity.Name;
          }
      }
  }