EF ObjectStateEntry OriginalValues包含CurrentValues

卡雷尔

我试图覆盖实体框架的SaveChanges()方法来保存审核信息。我从以下内容开始:

public override int SaveChanges()
{
    ChangeTracker.DetectChanges();
    ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext;
    List<ObjectStateEntry> objectStateEntryList = ctx.ObjectStateManager.GetObjectStateEntries(
                                                         EntityState.Added
                                                       | EntityState.Modified
                                                       | EntityState.Deleted).ToList();

    foreach (ObjectStateEntry entry in objectStateEntryList)
    {
        if (!entry.IsRelationship)
        {
            //Code that checks and records which entity (table) is being worked with
            ...

            foreach (string propertyName in entry.GetModifiedProperties())
            {
                DbDataRecord original = entry.OriginalValues;
                string oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString();

                CurrentValueRecord current = entry.CurrentValues;
                string newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString();

                if (oldValue != newValue)
                {
                    AuditEntityField field = new AuditEntityField
                    {
                        FieldName = propertyName,
                        OldValue = oldValue,
                        NewValue = newValue,
                        Timestamp = auditEntity.Timestamp
                    };
                    auditEntity.AuditEntityField.Add(field);
                }
            }
        }
    }
}

我遇到的问题是,我输入entry.OriginalValues和输入的entry.CurrentValues值始终是新的更新值:

审计实体状态

卡雷尔

已发现问题:

public ActionResult Edit(Branch branch)
{
    if (ModelState.IsValid)
    {
        db.Entry(branch).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(branch);
}

以上述方式保存更新似乎导致ChangeTracker不能选择旧值。我通过简单地使用ViewModels进行所有必需的更新来解决此问题:

public ActionResult Edit(BranchViewModel model)
{
    if (ModelState.IsValid)
    {
        Branch branch = db.Branch.Find(model.BranchId);

        if (branch.BranchName != model.BranchName)
        {
            branch.BranchName = model.BranchName;
            db.SaveChanges();
        }
        return RedirectToAction("Index");
    }
    return View(model);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Attach方法时EF 6 OriginalValues丢失

来自分类Dev

使用Attach方法时EF 6 OriginalValues丢失

来自分类Dev

查找并包含EF 6

来自分类Dev

EF Core包含查询

来自分类Dev

EF核心嵌套然后包含

来自分类Dev

EF6-使用包含与列表

来自分类Dev

EF忽略急切加载的“包含”语句

来自分类Dev

ef核心返回只是包含的实体

来自分类Dev

EF Core动态包含和订购

来自分类Dev

EF6-使用包含与列表

来自分类Dev

用异步和包含模拟EF

来自分类Dev

EF 6在包含导航属性的包含项中添加子句

来自分类Dev

EF Core 3,优化很多包含/然后包含

来自分类Dev

如何在EF中包含的实体中添加where子句?

来自分类Dev

EF代码优先:序列包含多个匹配元素

来自分类Dev

何时在EF中使用“包含”?不需要投影吗?

来自分类Dev

EF:在DbSet中添加实体的结果中包含导航属性

来自分类Dev

ICollection <>。由于HashSet失败而包含在EF中

来自分类Dev

序列在EF CF迁移中包含多个元素错误

来自分类Dev

EF 6.1序列包含一个以上的元素

来自分类Dev

使用任何而不是包含来优化EF查询

来自分类Dev

有条件地包含在EF Core中

来自分类Dev

EF Core 3.1不允许包含对Enum属性的搜索

来自分类Dev

EF LINQ-返回包含整个集合的实体

来自分类Dev

EF 6(例外)序列包含多个元素-插入新记录

来自分类Dev

包含不包括关系的 EF 6 复杂查询

来自分类Dev

EF Core 在使用连接查询后包含子项

来自分类Dev

在 EF Core 的集合中包含每个项目的属性

来自分类Dev

EF7 / Linq-包含嵌套对象的“包含”查询引发异常