假设我们有
Movie
实体,它具有属性 Id
、Title
、PublishDate
和 Description
。
如果我们想跟踪和存储实体的更改以供将来使用,最好的方法是什么?例如。我们想要获取并分组所有更改。
结果应类似于“标题已更改为 RandomTitle”,例如更改日期。
我了解如何使用
CreatedAt
和 ModifiedAt
实施审核,但我从未遇到过我应该实际存储更改历史记录的问题。
我想到的是创建单独的
MovieHistory
表来存储所有更改。
可能想查看事件溯源模式? 但如果没有,我在一个运行良好的项目中所做的就是扩展
DbContext
类,并在调用 SaveChangesAsync()
之前在 base.SaveChangesAysnc()
和其他保存方法中插入一些代码。 我这样做是为了更新缓存的数据,但它同样可以很好地获取已更改数据的快照。
可能看起来像这样:
public partial class Snapshot_MovieContext : MovieContext
{
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
return Task.Run(async () =>
{
var entityEntries = ChangeTracker.Entries().ToList();
entityEntries.ForEach(e => {
//Do your save stuff here
});
int result = await base.SaveChangesAsync(cancellationToken);
return result;
});
}
}
然后注入
Snapshot_MovieContext
并在 EF 调用中使用它而不是 MovieContext
。 您很可能希望覆盖 DbContext
中的所有“保存”方法。