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

3
我想添加一个列来存储记录保存到磁盘时的当前日期时间。有什么最好的方法来实现这个功能呢?
我知道这不是一个非常复杂的问题,但我想知道是否有任何最佳实践或EF的任何特性可以简化这个任务。 例如:
  • 是否有任何方法可以在表类中包含此字段的逻辑,以便每当保存到磁盘时自动更新?
  • 是否有任何事件可以捕获对象何时被修改或保存?
2个回答

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();
}

那是很多接口需要实现,但应该可以工作。 - hazimdikenli
这是一个有趣的解决方案,但我希望能简化我们的代码! :) 我们将继续在当前应用程序中手动更新字段(只有一个表格,并且仅从几个地方保存)。无论如何,通过查看您的代码,我学到了一些东西,这总是很好的! (在未来的项目中,这可能是一个不错的解决方案)。谢谢! - salgiza

0

很遗憾,目前没有你可以订阅的事件。我的建议是在你的上下文中重写SaveChanges方法并在那里执行自定义逻辑(如果你想保持代码整洁,可以公开你自己的事件)。

编辑

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接