问题描述
|
上面的控制器具有标准的编辑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。