在Entity Framework 6.1.3中调用SaveChanges时获取实体名称

时间:2017-06-07 04:16:04

标签: c# asp.net-mvc entity-framework entity-framework-6

我试图覆盖SaveChanges()类中的DbContext方法,这是因为我尝试获取实体的名称,其中添加了行,删除或更新了行的相应ID并采取了行动。

我不知道该怎么做。

这与日志操作有关。

提前问候。

1 个答案:

答案 0 :(得分:4)

您需要覆盖DbContext的SaveChanges方法,并使用ChangeTracker跟踪实体在保存到database.public之前所做的更改

public class ChangeLog  
{
    public string EntityName { get; set; }
    public string PropertyName { get; set; }
    public string OldValue { get; set; }
    public string NewValue { get; set; }
}

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

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

        foreach(var prop in change.OriginalValues.PropertyNames)
        {
            var originalValue = change.OriginalValues[prop].ToString();
            var currentValue = change.CurrentValues[prop].ToString();
            if (originalValue != currentValue)
            {
                ChangeLog log = new ChangeLog()
                {
                    EntityName = entityName,
                    PropertyName = prop,
                    OldValue = originalValue,
                    NewValue = currentValue,
                };
                ChangeLogs.Add(log);
            }
        }
    }        
    return base.SaveChanges();
}

在上面的代码片段中,我们查询了更改跟踪器api以获取已修改的实体

var modifiedEntities = ChangeTracker.Entries()
        .Where(p => p.State == EntityState.Modified).ToList();

您可以查询添加和删除的实体。

<强> 修改

object GetPrimaryKeyValue(DbEntityEntry entry)  
{
        var stateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
        return stateEntry.EntityKey.EntityKeyValues[0].Value;
}

注意:如果您将“标识符插入”设置为“开”,那么对于上面添加的实体,代码段将不起作用。