如何将所有操作的更改值记录到数据库?
上面的控制器有一个标准的编辑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
}
...或者也许有人有另一种方法将数据库中的所有更改保存到所有控制器操作的另一个表中,因此在项目发布后我可以看到用户做了什么。 附言。我不知道用户触发了什么。
The controller above has a standard edit ActionResult. I simply find rows in a database by ID and update it.
Before db.SaveChanges() there is log.Save() static function that saves all changes in model to separate tables in the database.
It simply check old and new values from ChangeTracker.
The problem is, i want use log.Save() after db.SaveChanges(), not before, to be sure that data was really saved.
But after, in the ChangeTracker there aren't any changes so log.Save() doesn't have anything to save.
Controller:
[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 Class:
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
}
... or maybe someone has another way to save all changes in a database to another table on all controller actions, so after the project release I can see what users do.
PS. I don't what user triggers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
EF4 中的 SaveChanges 是虚拟,因此您可以覆盖它,添加自定义日志记录等。
SaveChanges in EF4 is virtual, so you can override it, add custom logging etc.
为什么不在日志类中使用
try{} catch{}
并将返回参数从“void
”更改为“bool
”。如果 db.SaveChanges() 成功,则返回 true。然后在“ActionResult edit
”中使用bool result = log.Save(Log.ChangeType.Edit, db, id);
检索日志是否保存了更改,然后使用一个简单的 if 语句来验证是否可以将所有更改保存到数据库。Why don't you use
try{} catch{}
within Log Class and change the return parameter from 'void
' to 'bool
'. This would return true if thedb.SaveChanges()
succeeds. Then within "ActionResult edit
" usebool result = log.Save(Log.ChangeType.Edit, db, id);
to retrieve if the log saved the changes, then use a simple if-sentence to validate if you can save all changes to db or not.