如何解决EF Core ChangeTracker的当前值和原始值与已修改实体相同
我正在使用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
,这就是BEFORE_JSON
和AFTER_JSON
在我的{{ 1}}:
UPDATE
解决方法
我认为这应该是等效的,但是复杂性要低一些;
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]);
}
但是您从变更跟踪器中获得的收益取决于您所投入的内容。您的实体是从数据库中加载然后更改的吗?还是重新附加修改后的内容?
审核原始值的最可靠方法是在数据库触发器中,或者使用其他内置数据库功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。