上面的控制器有一个标准的编辑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。我不是什么用户触发。
是的,我忘记压倒一切。谢谢! :) – revelvice 2011-05-31 20:49:06