2011-05-31 25 views
1

上面的控制器有一个标准的编辑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"); 
} 

Log类:

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

的SaveChanges在EF4为virtual,这样你就可以覆盖它,添加自定义日志等

+0

是的,我忘记压倒一切。谢谢! :) – revelvice 2011-05-31 20:49:06

-2

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

+0

分离Log和'SaveChanges'的逻辑是不必要的,因为它们都可能不是在重写的SaveChanges中同时存在,就像建议的那样。 – 2012-10-26 07:53:05

相关问题