如何在EF Code First中创建/更新LastModified字段

我想在记录保存到磁盘时添加一个存储当前DateTime的列。 实现这一目标的最佳方法是什么?

我知道这不是一个非常复杂的问题,但我想知道是否有任何最佳实践或EF的任何function可以简化任务。 例如:

  • 有没有办法在表Class中包含该字段的逻辑,以便它在保存到磁盘时自动更新?
  • 修改或保存对象时是否有捕获事件?

一种选择是创建存储库层并实现自己的SaveChanges

public void SaveChanges() { foreach (var entry in Context.ChangeTracker.Entries().Where(x => x.State == EntityState.Added && x.Entity.CreatedAt == default(DateTime))) entry.Entity.CreatedAt = DateTime.Now; foreach (var entry in Context.ChangeTracker.Entries().Where(x => x.State == EntityState.Added && x.Entity.CreatedBy == null)) entry.Entity.CreatedBy = ContextManager.CurrentUser; foreach (var entry in Context.ChangeTracker.Entries().Where(x => x.State == EntityState.Modified)) entry.Entity.ModifiedAt = DateTime.Now; foreach (var entry in Context.ChangeTracker.Entries().Where(x => x.State == EntityState.Modified)) entry.Entity.ModifiedBy = ContextManager.CurrentUser; Context.SaveChanges(); } 

不幸的是,没有您可以订阅的活动。 我的建议是在你的上下文中覆盖SaveChanges方法并在那里做你的自定义逻辑(如果你想保持它干净,你可以暴露自己的事件)

编辑

我为此选择的一个解决方案是让我的所有实体都从一个公共基类(例如EntityBase)inheritance,它暴露了方法BeforeSave()和AfterSave(),你可以在重写SaveChanges方法时在自定义DbContext中调用它们(看看所有修改过的条目的ChangeTracker)