如何在所有操作上将更改的值记录到数据库?

问题描述

| 上面的控制器具有标准的编辑ActionResult。我只是通过ID在数据库中查找行并对其进行更新。在db.SaveChanges()之前有log.Save()静态函数,该函数将模型中的所有更改保存到数据库中的单独表中,只需检查ChangeTracker中的新旧值即可。 问题是,我想在db.SaveChanges()之后而不是之前使用log.Save(),以确保确实保存了数据。 但是之后,在ChangeTracker中没有任何更改,因此log.Save()没有任何要保存的内容。 控制器:
[HttpPost]
public ActionResult edit(int id,MyModel model)
{
  var hihi = db.MyModel.First(s => s.ID == model.ID);

  hihi.col1 = model.col1;
  hihi.col2 = model.col2;
  ...

  log.Save(Log.ChangeType.Edit,db,id);
      ^ Here i save changes to log.

  db.SaveChanges();


  return RedirectToAction(\"Index\");
}
日志类别:
public void Save(ChangeType changeType,DBContext parentContext,int id)
{
  DBContext db = new DBContext();

  foreach (System.Data.Entity.Infrastructure.DbEntityEntry ee in parentContext.ChangeTracker.Entries())
  {
    foreach (string column in ee.OriginalValues.PropertyNames)
    {
      string oldValue = ee.OriginalValues[column].ToString();
      string newValue = ee.CurrentValues[column].ToString();

      if (oldValue != newValue)
      {
         var model = new LogModel
         {
            Log_Time = DateTime.Now,Log_Operator = User.Ope_ID,Log_Table = ee.Entity.ToString().Replace(\"xxx.Models.\",\"\"),Log_Key = id,Log_Column = column,Log_Type = (int)changeType,Log_OldValue = oldValue,Log_NewValue = newValue
          };

          var log = db.Log.Add(model);
          db.SaveChanges();
        }
      }
   }
}

public enum ChangeType
{
  Create = 1,Delete = 2,Edit = 3
}
...也许有人用另一种方式将所有控制器动作中数据库中的所有更改保存到另一个表中,因此在项目发布后,我可以看到用户的操作。 PS。我不知道用户会触发什么。     

解决方法

        EF4中的SaveChanges是虚拟的,因此您可以覆盖它,添加自定义日志记录等。     ,        为什么不在Log Class中使用
try{} catch{}
并将return参数从\'
void
\'更改为\'
bool
\'。如果
db.SaveChanges()
成功,则返回true。然后在\“
ActionResult edit
\”中使用
bool result = log.Save(Log.ChangeType.Edit,db,id);
来检索日志是否保存了更改,然后使用简单的if语句来验证是否可以将所有更改保存到db。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...