如何检查修改了哪些属性/条目以及未修改哪些属性/条目在EF 6中编辑记录

我正在使用EF 6开发MVC 5应用程序。编辑的自动生成的POST方法是:

public ActionResult Edit([Bind(Include = "Id,Name,Address,Phone,SSNo,D1")] ABC abc) { if (ModelState.IsValid) { db.Entry(abc).State = EntityState.Modified; db.SaveChanges(); } return View(abc); } 

是否有任何过程/方法可以获得哪些条目被修改以及这些条目的原始值是什么。 我已经尝试过在这个问题中标记为答案的方法,但是虽然已经进行了更改,但是它没有得到任何更改,即循环不会迭代。

我的代码是:

  public ActionResult Edit([Bind(Include = "Id,Name,Address,Phone,SSNo,D1")] ABC abc) { if (ModelState.IsValid) { db.ABCs.Attach(abc); var myObjectState = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.GetObjectStateEntry(abc); var modifiedProperties = myObjectState.GetModifiedProperties(); foreach (var propName in modifiedProperties) { Console.WriteLine("Property {0} changed from {1} to {2}", propName, myObjectState.OriginalValues[propName], myObjectState.CurrentValues[propName]); } Console.ReadKey(); db.Entry(abc).State = EntityState.Modified; db.SaveChanges(); return Json(abc); } return View(abc); } 

ABC模型包含除方法参数中提到的许多值以外的其他值,但我只传递可以编辑的值

我想要做的是在我的数据库中维护对文档所做的所有更改的日志。 我想在日志中修改之前只包括更改和原始值,而不是完整记录。

我怎么能得到这个?

我为你实现了这个扩展方法:

 namespace YourProject.Extensions { public static class ModelExtensions { public static IEnumerable> ModifiedValues(this T obj, T modifiedObject) { foreach (var property in typeof(T).GetProperties().Where(p => !p.GetGetMethod().IsVirtual)) { if (property.GetValue(obj).ToString() != property.GetValue(modifiedObject).ToString()) { yield return new KeyValuePair(property.Name, property.GetValue(modifiedObject)); } } } } } 

它既不是最快也不是最有效的,而是在我的测试中工作。

使用:

 var originalEntity = await db.Entities.AsNoTracking().FirstOrDefaultAsync(e => e.EntityId == modifiedEntity.EntityId); var modifiedValues = originalEntity.ModifiedValues(modifiedEntity).ToList();