C# EF Core ChangeTracker()修改实体的当前值和原始值相同

C# EF Core ChangeTracker()修改实体的当前值和原始值相同,c#,entity-framework-core,audit-logging,C#,Entity Framework Core,Audit Logging,我正在使用EF Core的变更跟踪程序创建审计跟踪,对于状态已添加、已修改或已删除,我将创建一个新的审计实体以插入我的审计表中。我想在更新之前拍摄一张快照,用JSON捕捉它,并在更新之后拍摄实体的快照 var entityType = this.Model.FindEntityType(dbEntry.Entity.GetType()); var originalObjectProperties = new Dictionary<string, object>(); var curr

我正在使用EF Core的变更跟踪程序创建审计跟踪,对于状态
已添加
已修改
已删除
,我将创建一个新的审计实体以插入我的
审计
表中。我想在
更新
之前拍摄一张快照,用JSON捕捉它,并在
更新
之后拍摄实体的快照

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

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

var originalObjectProperties=new Dictionary();
var currentObjectProperties=新字典();
foreach(dbEntry.Properties中的var属性)
{
var key=property.Metadata.GetColumnName().ToUpper();
添加(key,property.OriginalValue);
添加(key,dbEntry.CurrentValues[property.Metadata]);
}
但是,你从你的变化追踪器中得到了什么,取决于你投入了什么。您的实体是否从数据库中加载,然后进行了更改?还是重新附加为修改


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

我试图避免数据库触发器,但在测试中,我创建了一个新的
工作请求
实体并将其插入数据库。然后,我使用该实体的键将其从数据库中取出,更改
项目名称
属性并在数据库中更新它。最后,我从数据库中删除了实体。您可以首先从数据库中获取实体,然后更新它。这样,changetracker将知道以前的值。无论如何,唯一100%可靠的机制是通过数据库上的触发器
{
    "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
}