在EF(DbContext)中为实体的每个“添加”或“更新”运行代码

时间:2018-07-29 08:51:31

标签: c# entity-framework

我有许多我的代码优先实体实现的接口:

public interface IRecordTracking
{
    DateTime CreateDate { get;set; }
    DateTime UpdateDate { get;set; }
} 

我的DbContext前面还有一个存储库,其中包含使用以下代码的Add / Update方法:

添加:

if (item is IRecordTracking tracking)
    tracking.CreateDate = DateTime.UtcNow;

更新:

if (item is IRecordTracking tracking)
    tracking.UpdateDate = DateTime.UtcNow;

我的问题是,我正在寻找一种创建整个实体链的方案:

  • 赞助商
    • SponsorID
    • ...
    • EntityID
    • 实体
      • EntityID
      • 地址
      • ...
      • 创建日期
      • UpdateDate

如您所见,更新/创建在子属性Entity上。

当我在存储库中调用AddUpdate时,我传递的是Sponsor对象,而不是实体(作为子属性的对象除外)。因此,我检查“ item is IRecordTracking”是否为假。

我的问题是:

  • 是否可以在DbContext上拦截所有插入/更新并在那里运行此逻辑?
  • 或者,是否存在一种干净/高效的方法来遍历属性树并检查实现IRecordTracking的类型?这样,我的存储库(RepositoryBase类)保留了此逻辑,但是会检查所有子级...

谢谢

1 个答案:

答案 0 :(得分:0)

在DbContext类中,您重写基本的OnSaveChange方法。大多数“ EF审核”项目都是通过这种方式来实现的,而我是倡导者,例如在.net core中:

https://www.meziantou.net/2017/08/14/entity-framework-core-history-audit-table

@Gert有一点,我工作过的所有工程公司都有“历史记录”表,其他公司都可以使用CreatedBy,CreatedDate,ModifiedBy,ModifiedDate字段。

取决于您的dB,该主题上有很多内容,例如How to store historical records in a history table in SQL Server

请注意在db中执行此操作的其他要点效率更高,但是开销更大。我喜欢只记录一种通用方法中已更改的字段的中间立场。

如果可以进行云计算,则说明您走上了正轨。