微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF Core ChangeTracker的当前值和原始值与已修改实体相同

如何解决EF Core ChangeTracker的当前值和原始值与已修改实体相同

我正在使用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,这就是BEFORE_JSONAFTER_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 举报,一经查实,本站将立刻删除。