如何首先在 EF 代码中创建/更新上次修改时间字段

本文关键字:更新 修改 字段 时间 创建 何首先 EF 代码 | 更新日期: 2023-09-27 17:56:46

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

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

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

如何首先在 EF 代码中创建/更新上次修改时间字段

一种选择是创建存储库层并实现自己的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();
}

不幸的是,没有您可以订阅的事件。我的建议是在您的上下文中重写 SaveChanges 方法并在那里执行自定义逻辑(如果您想保持干净,您可以公开自己的事件)

编辑

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