我有许多我的代码优先实体实现的接口:
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;
我的问题是,我正在寻找一种创建整个实体链的方案:
如您所见,更新/创建在子属性Entity上。
当我在存储库中调用Add
或Update
时,我传递的是Sponsor对象,而不是实体(作为子属性的对象除外)。因此,我检查“ item is IRecordTracking”是否为假。
我的问题是:
IRecordTracking
的类型?这样,我的存储库(RepositoryBase类)保留了此逻辑,但是会检查所有子级... 谢谢
答案 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中执行此操作的其他要点效率更高,但是开销更大。我喜欢只记录一种通用方法中已更改的字段的中间立场。
如果可以进行云计算,则说明您走上了正轨。