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

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

我正在尝试重写 DbContext 类中的 SaveChanges() 方法,这是因为我尝试获取添加、删除或删除行的实体的名称更新了行的相应 ID 和执行的操作。

我不知道该怎么做。

这是出于记录操作的目的。

提前问好。

最佳答案

您需要重写 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;
}

注意:如果您将“身份插入”设置为“打开”,则对于添加的实体,上述代码段将不起作用。

关于c# - 在 Entity Framework 6.1.3 中调用 SaveChanges 时获取实体名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403388/

相关文章:

c# - Entity Framework 7 关系

c# - Unity 中的 OpenCV(EMGUCV 包装器)集成

c# - ASP.NET MVC 下载图像而不是在浏览器中显示

c# - 不同项目中的 ASP.NET MVC、EntityFramework、DBContext、存储库

c# - 使用 ASP.net 核心(API Controller )处理基础 Controller 中的异常

c# - 请帮助我无法在一个 View 中了解多个模型

C# - Entity Framework - 大型种子数据代码优先

c# - 如何在 docker 镜像中使用本地生成的 NuGet?

c# - JSON.net反序列化对象嵌套数据

asp.net-mvc - 使用 MVC 为 iPhone 应用程序构建 RESTful API - 如何保护它?