EntityFramework Core:获取实体和相关数据中发生的更改

时间:2018-10-30 12:41:08

标签: c# asp.net-core .net-core entity-framework-core

我想让一个实体及其附属的相关数据发生更改。

我知道如何获取在一个实体中已更改的属性名称:

 dbContext.Entry(entity).Properties.Where(x => x.IsModified).Select(x => x.Metadata.Name).ToList();

如何对导航属性中的相关数据执行相同的操作?

1 个答案:

答案 0 :(得分:6)

基于此article (Entity Change Tracking using DbContext in Entity Framework 6),您应该覆盖SaveChanges()方法以跟踪实体更改及其相关实体。

public override int SaveChanges()
{
    return base.SaveChanges();
} 

实际上,您应该将上面的代码更改为以下示例:

public override int SaveChanges()
{
    var modifiedEntities = ChangeTracker.Entries()
        .Where(p => p.State == EntityState.Modified).ToList();
    var now = DateTime.UtcNow;

    foreach (var change in modifiedEntities)
    {
        var entityName = change.Entity.GetType().Name;
        var primaryKey = GetPrimaryKeyValue(change);

        foreach(var prop in change.OriginalValues.PropertyNames)
        {
            var originalValue = change.OriginalValues[prop].ToString();
            var currentValue = change.CurrentValues[prop].ToString();
            if (originalValue != currentValue) //Only create a log if the value changes
            {
                //Create the Change Log
            }
        }
    }
    return base.SaveChanges();
}