3

我正在使用 EF Core 的更改跟踪器创建审计跟踪,并且对于每个具有 state或的实体Added,我创建一个新的审计实体以插入到我的表中。我想拍摄我之前的快照并在 JSON 中捕获它,并对 . 之后的实体快照执行相同的操作。ModifiedDeletedAuditUPDATEUPDATE

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,UPDATEDELETE, 这就是我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
}
4

1 回答 1

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

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

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

于 2020-09-17T02:54:44.853 回答