7

我已经覆盖了 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 个实体,并且都标记为已修改 (EntityState.Modified)。其中之一已被修改并且与底层数据库行不同。另一个实际上与底层数据库行没有什么不同,它只是被标记为这样。

在调用 SaveChanges()之后,我如何判断这两个实体中的哪一个实际上更新了数据库中的一行,而哪一个根本没有真正修改?

4

1 回答 1

4

这就是我们执行代码的方式。延迟加载和代理创建已启用。

请注意,当启用代理创建时,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;
          }
      }
  }
于 2011-11-14T22:20:02.600 回答