我有一个使用ASP.NET CORE构建的API。在它获取数据到客户端应用程序(JS Web应用程序)后,如下所示:
public IEnumerable<Article> GetAvaliableArticles()
{
ThrowIfDisposed();
return Entities.Where(s => s.IsAvailable).OrderBy(x => x.DisplayOrder);
}
当客户端应用程序想要更新每篇文章时,我将实体附加回上下文:
Context.Attach(entity);
if(entity.GetType().GetProperty("ConcurrencyStamp") != null)
{
var propertyInfo = entity.GetType().GetProperty("ConcurrencyStamp");
propertyInfo.SetValue(entity, Guid.NewGuid().ToString());
}
Context.Update(entity);
await Context.SaveChangesAsync(cancellationToken);
但是,当我尝试审核EF的更改时,它没有获得文章的先前值。原始值和新值是相同的。
switch (entry.State)
{
case EntityState.Added:
auditEntry.NewValues[propertyName] = property.CurrentValue;
break;
case EntityState.Deleted:
auditEntry.OldValues[propertyName] = property.OriginalValue;
break;
case EntityState.Modified:
if (property.IsModified)
{
auditEntry.OldValues[propertyName] = property.OriginalValue;
auditEntry.NewValues[propertyName] = property.CurrentValue;
}
break;
}
我希望property.OriginalValue
成为更新前的前一个值。
对于Context.Attach(entity);
,默认值或原始值来自客户端传递的entity
,而不是查询数据库。
要获得解决方法,您可以尝试使用entry.GetDatabaseValues().GetValue<object>(property.Metadata.Name)
来获取数据库原始值。
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var entries = ChangeTracker.Entries().Where(e => !(e.Entity is Audit) && e.State != EntityState.Detached && e.State != EntityState.Unchanged);
foreach (var entry in entries)
{
switch (entry.State)
{
case EntityState.Modified:
foreach (var property in entry.Properties)
{
if (property.IsModified)
{
var original = entry.GetDatabaseValues().GetValue<object>(property.Metadata.Name);
var current = property.CurrentValue;
}
}
break;
}
}
return base.SaveChanges();
}