gpt4 book ai didi

c# - EF Core ChangeTracker() 当前值和原始值对于修改后的实体是相同的

转载 作者:行者123 更新时间:2023-12-04 15:18:17 25 4
gpt4 key购买 nike

我正在使用 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 在我的数据库中用于我的UPDATE:

{
"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]);
}

但是您从更改跟踪器中得到什么,取决于您放入其中的内容。您的实体是从数据库加载然后更改的吗?还是修改后重新附加?

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

关于c# - EF Core ChangeTracker() 当前值和原始值对于修改后的实体是相同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63920527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com