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

时间:2011-05-31 20:14:43

标签: entity-framework sql-server-2008 asp.net-mvc-3

上面的控制器有一个标准编辑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。我没有用户触发的内容。

2 个答案:

答案 0 :(得分:2)

EF4中的SaveChanges为virtual,因此您可以覆盖它,添加自定义日志记录等。

答案 1 :(得分:-2)

为什么不在日志类中使用try{} catch{}并将返回参数从“void”更改为“bool”。如果db.SaveChanges()成功,这将返回true。然后在“ActionResult edit”内使用bool result = log.Save(Log.ChangeType.Edit, db, id);检索日志是否保存了更改,然后使用简单的if-sentence验证是否可以将所有更改保存到db。