我正在使用EF Core的更改跟踪器创建一个审计跟踪,对于每个具有状态Added
、Modified
或Deleted
的实体,我创建一个新的审计实体以插入到我的Audit
表中。我想对UPDATE
之前的内容进行快照,并用JSON捕获它,对UPDATE
之后的实体进行快照。
var entityType = this.Model.FindEntityType(dbEntry.Entity.GetType());
var originalObjectProperties = new Dictionary<string, object>();
var currentObjectProperties = new Dictionary<string, object>();
foreach (var property in entityType.GetProperties())
{
originalObjectProperties.Add(property.GetColumnName().ToUpper(), dbEntry.OriginalValues[property.Name]);
currentObjectProperties.Add(property.GetColumnName().ToUpper(), dbEntry.CurrentValues[property.Name]);
}
dbEntry
是来自变更跟踪器的实体条目。不过,这些给了我完全相同的JSON。在我的测试中,我有一个INSERT
、UPDATE
和DELETE
,这就是我的UPDATE
数据库中的BEFORE_JSON
和AFTER_JSON
:
{
"WORK_REQUEST_KEY": 2,
"PROJECT_NAME": "This has now been updated",
"WR_TYPE_KEY": 2
}
{
"WORK_REQUEST_KEY": 2,
"PROJECT_NAME": "This has now been updated",
"WR_TYPE_KEY": 2
}
我认为这应该是等价的,但复杂性略低;
var originalObjectProperties = new Dictionary<string, object>();
var currentObjectProperties = new Dictionary<string, object>();
foreach (var property in dbEntry.Properties)
{
var key = property.Metadata.GetColumnName().ToUpper();
originalObjectProperties.Add(key, property.OriginalValue);
currentObjectProperties.Add(key, dbEntry.CurrentValues[property.Metadata]);
}
但是,你从你的更改跟踪器中得到什么,取决于你在其中投入了什么。你的实体是从数据库中加载的,然后被更改了吗?还是修改后重新连接?
审计原始值最可靠的方法是在数据库触发器中,或者使用其他内置的数据库功能。