EF Core ChangeTracker()当前值和原始值对于Modified实体是相同的



我正在使用EF Core的更改跟踪器创建一个审计跟踪,对于每个具有状态AddedModifiedDeleted的实体,我创建一个新的审计实体以插入到我的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。在我的测试中,我有一个INSERTUPDATEDELETE,这就是我的UPDATE数据库中的BEFORE_JSONAFTER_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]);
}

但是,你从你的更改跟踪器中得到什么,取决于你在其中投入了什么。你的实体是从数据库中加载的,然后被更改了吗?还是修改后重新连接?

审计原始值最可靠的方法是在数据库触发器中,或者使用其他内置的数据库功能。

相关内容

最新更新