我想在记录保存到磁盘时添加一个存储当前DateTime的列。实现这一目标的最佳方法是什么?
我知道这不是一个非常复杂的问题,但我想知道是否有任何最佳实践或EF的任何功能可以简化任务。 例如:
答案 0 :(得分:2)
一个选项是创建存储库层并实现自己的SaveChanges
public void SaveChanges()
{
foreach (var entry in Context.ChangeTracker.Entries<ICreatedAt>().Where(x => x.State == EntityState.Added && x.Entity.CreatedAt == default(DateTime)))
entry.Entity.CreatedAt = DateTime.Now;
foreach (var entry in Context.ChangeTracker.Entries<ICreatedBy>().Where(x => x.State == EntityState.Added && x.Entity.CreatedBy == null))
entry.Entity.CreatedBy = ContextManager.CurrentUser;
foreach (var entry in Context.ChangeTracker.Entries<IModifiedAt>().Where(x => x.State == EntityState.Modified))
entry.Entity.ModifiedAt = DateTime.Now;
foreach (var entry in Context.ChangeTracker.Entries<IModifiedBy>().Where(x => x.State == EntityState.Modified))
entry.Entity.ModifiedBy = ContextManager.CurrentUser;
Context.SaveChanges();
}
答案 1 :(得分:0)
不幸的是,没有您可以订阅的活动。我的建议是在你的上下文中覆盖SaveChanges方法并在那里做你的自定义逻辑(如果你想保持它清洁,你可以暴露自己的事件)
编辑
我选择的一个解决方案是让我的所有实体都从一个公共基类继承(例如EntityBase),它暴露了方法BeforeSave()和AfterSave(),在覆盖SaveChanges方法时可以在自定义DbContext中调用它们(查看所有修改过的条目的ChangeTracker)