使用 .NET 和 EF Core 跟踪和存储实体更改的最佳方法是什么?

问题描述 投票:0回答:1

假设我们有

Movie
实体,它具有属性
Id
Title
PublishDate
Description

如果我们想跟踪和存储实体的更改以供将来使用,最好的方法是什么?例如。我们想要获取并分组所有更改。

结果应类似于“标题已更改为 RandomTitle”,例如更改日期。

我了解如何使用

CreatedAt
ModifiedAt
实施审核,但我从未遇到过我应该实际存储更改历史记录的问题。

我想到的是创建单独的

MovieHistory
表来存储所有更改。

c# .net entity-framework-core
1个回答
0
投票

可能想查看事件溯源模式? 但如果没有,我在一个运行良好的项目中所做的就是扩展

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
中的所有“保存”方法。

© www.soinside.com 2019 - 2024. All rights reserved.