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

Entity framework 如何在所有操作中将更改的值记录到数据库?,entity-framework,sql-server-2008,asp.net-mvc-3,Entity Framework,Sql Server 2008,Asp.net Mvc 3,上面的控制器具有标准的编辑操作结果。我只需按ID查找数据库中的行并进行更新。在db.SaveChanges()之前,有一个log.Save()静态函数,用于将模型中的所有更改保存到数据库中的单独表。它只需从ChangeTracker中检查新旧值。 问题是,我希望在db.SaveChanges()之后而不是之前使用log.Save(),以确保数据确实已保存。 但是之后,在ChangeTracker中没有任何更改,因此log.Save()没有任何要保存的内容 控制器: [HttpPost] publ

上面的控制器具有标准的编辑操作结果。我只需按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
}
。。。或者可能有人有另一种方法将数据库中的所有更改保存到所有控制器操作的另一个表中,这样在项目发布后,我就可以看到用户在做什么了。
另外,我不知道用户触发了什么。

保存EF4中的更改,以便您可以覆盖它,添加自定义日志记录等。

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

是,我忘记了覆盖。谢谢!:)不需要将日志逻辑和
SaveChanges
分开,因为正如建议的那样,它们可能不会同时出现在被覆盖的
SaveChanges
中。