获取分离实体的原始值

问题描述 投票:1回答:1

我有一个使用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成为更新前的前一个值。

c# asp.net-core entity-framework-core
1个回答
2
投票

对于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();
}
© www.soinside.com 2019 - 2024. All rights reserved.