C# EF Core ChangeTracker()修改实体的当前值和原始值相同
我正在使用EF Core的变更跟踪程序创建审计跟踪,对于状态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
已添加
、已修改
或已删除
,我将创建一个新的审计实体以插入我的审计
表中。我想在更新
之前拍摄一张快照,用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
}