在我的应用程序中,我想记录模型的某些属性的每个更改到数据库。所以,假设我有这个模型:
public class MyModel
{
public int x1 {get; set;}
public int x2 {get; set;}
}
在这个模型中我有编辑动作:
[HttpPost]
public ActionResult Edit(MyModel model)
{
if (ModelState.IsValid)
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
在这个编辑操作中,我想确定属性x1是否已更改,如果是,我将在另一个表中创建日志,但我不知道,如何确定,哪个属性已更改。任何人都可以给我一些建议怎么做?
提前谢谢。
答案 0 :(得分:0)
不,MVC中没有任何事情可做。 ASP.NET WebForms通过在视图状态中包含字段的原始值来实现这一点,但是在其核心MVC中包含HTTP的无状态性并不会这样做。
答案 1 :(得分:0)
所以我对数据库进行了额外的打击,就像这样:
[HttpPost]
public ActionResult Edit(MyModel model)
{
if (ModelState.IsValid)
{
MyModel m = db.MyModels.Find(model.MyModelId);
if (m.x1 != model.x1)
//Fire log function here
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
但如果有更好的解决方案,我会很高兴听到它。谢谢。
答案 2 :(得分:0)
您应该能够在部分DBContext类中执行以下操作:
public bool HasChanges(MyEntity myentity)
{
return this.ChangeTracker.Entries().Any(e => e.Entity == myentity &&
(this.Entry(myentity).GetDatabaseValues().GetValue<DateTimeOffset>("aDateField") != myentity.aDateField)
);
}
如果特定字段已更改,则返回true。您可以将其扩展为使用匿名类型,但我不确定如何执行此操作。
如果你想检查实体是否已被更改,那么你可以将以下代码与上面的代码结合起来,给你类似的东西。
public bool HasChanges()
{
return this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added
|| e.State == EntityState.Modified
|| e.State == EntityState.Deleted);
}
可能有更好的方法可以做到这一点,但它适用于特定的实体。