C# ChangeTracker.Entries()CurrentValue等于EF7中的OriginalValue

C# ChangeTracker.Entries()CurrentValue等于EF7中的OriginalValue,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我在EF7/asp.Net核心应用程序中遇到问题。在我的上下文中,我创建了一个保存方法: public int Save() { ChangeTracker.DetectChanges(); var modifiedEntities = ChangeTracker.Entries() .Where(p => p.State == EntityState.Modified || p.State == EntityStat

我在EF7/asp.Net核心应用程序中遇到问题。在我的上下文中,我创建了一个保存方法:

    public int Save()
    {
        ChangeTracker.DetectChanges();
        var modifiedEntities = ChangeTracker.Entries()
            .Where(p => p.State == EntityState.Modified || p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified || p.State == EntityState.Detached).ToList();
        var now = DateTime.UtcNow;

        foreach (var change in modifiedEntities)
        {
            var entityName = change.Entity.GetType().Name;
            var primaryKeyValue = GetPrimaryKeyValue(change.Entity);
            foreach (var prop in change.Entity.GetType().GetTypeInfo().DeclaredProperties)
            {
                if (!prop.GetGetMethod().IsVirtual)
                {
                    var currentValue = change.Property(prop.Name).CurrentValue;
                    var originalValue = change.Property(prop.Name).OriginalValue;
                    if (originalValue.ToString() != currentValue.ToString())
                    {
                        var changeLoged = new ChangeLog
                        {
                            PropertyName = prop.Name,
                            EntityName = entityName,
                            PrimaryKeyValue = primaryKeyValue,
                            DateChange = now,
                            OldValue = originalValue.ToString(),
                            NewValue = currentValue.ToString(),
                            ChangedBy = "test"
                        };
                        ChangeLog.Add(changeLoged);
                    }
                }
            }
        }
        return base.SaveChanges();
    }
和方法GetPrimaryKeyValue:

protected virtual int GetPrimaryKeyValue<T>(T entity)
    {
        var test = entity;
        var test2 = test.GetType();
        var keyName = this.Model.FindEntityType(test2).FindPrimaryKey().Properties
            .Select(x => x.Name).Single();
        var result = (int)entity.GetType().GetProperty(keyName).GetValue(entity, null);
        if (result < 0)
            return -1;

        return result;
    }
受保护的虚拟int GetPrimaryKeyValue(T实体)
{
var测试=实体;
var test2=test.GetType();
var keyName=this.Model.FindentialType(test2.FindPrimaryKey().Properties
.Select(x=>x.Name).Single();
var result=(int)entity.GetType().GetProperty(keyName).GetValue(entity,null);
如果(结果<0)
返回-1;
返回结果;
}
不幸的是,change.Property(prop.Name).CurrentValue始终等于OriginalValue,因此
originalValue.ToString()!=currentValue.ToString()


始终返回false。

这不会准确回答您的问题,因为我无法复制此问题,但这可能会对您有所帮助

在EF Core中,属性Entry类现在有一个已修改的属性,它让您知道值是否已修改

您应该改为使用它:

if (change.Property(prop.Name).IsModified)
{
    var changeLoged = new ChangeLog
    {
        PropertyName = prop.Name,
        EntityName = entityName,
        PrimaryKeyValue = primaryKeyValue,
        DateChange = now,
        OldValue = originalValue.ToString(),
        NewValue = currentValue.ToString(),
        ChangedBy = "test"
    };
    ChangeLog.Add(changeLoged);
}
免责声明:我是项目的所有者

该库有一个审计功能(支持EF Core),您可以使用它或从中获得灵感来创建审计(代码是开源的)

文档:

替换:

var originalValue = change.Property(prop.Name).OriginalValue;
致:

var originalValue=change.GetDatabaseValues().GetValue(prop.Name);

看看图书馆。它会截取上下文的
SaveChanges
,为EF CRUD操作生成详细的审核日志。使用实体框架和实体框架核心进行标记有点混乱,因为它们是不同的框架。如果它与原始框架不同,或者如果它已写入,它是否会被设置为修改?
var originalValue = change.GetDatabaseValues().GetValue<object>(prop.Name);