【问题标题】:EF Core ChangeTracker() current and original values are the same for Modified entitiesEF Core ChangeTracker() 修改实体的当前值和原始值相同
【发布时间】:2021-01-03 07:31:36
【问题描述】:

我正在使用 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
}

【问题讨论】:

    标签: c# entity-framework-core audit-logging


    【解决方案1】:

    我认为这应该是等价的,但复杂度略低;

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

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

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

    【讨论】:

    • 我试图避免数据库触发器,但在我的测试中,我正在创建一个新的WORK_REQUEST 实体并将其插入到数据库中。然后我使用它的键将该实体从数据库中取出,更改PROJECT_NAME 属性并在数据库中更新它。最后我从数据库中删除实体。
    • 您可以先从数据库中获取实体,然后更新它。这样,changetracker 将知道以前的值。无论如何,唯一 100% 可靠的机制是通过数据库上的触发器
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多