我已经覆盖了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()之后告诉两个实体中哪一个实际更新了数据库中的一行,哪一个实际上没有真正修改过呢?
答案 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;
}
}
}