1

在我的应用程序中,我想将模型的某些属性的每次更改记录到数据库中。所以假设我有这个模型:

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 是否已更改,如果是,我将在另一个表中创建日志,但我不知道如何确定哪个属性已更改。任何人都可以给我一条建议如何做到这一点?

先感谢您。

4

3 回答 3

0

不,在 MVC 中没有什么可以做的。ASP.NET WebForms 通过在视图状态中包含字段的原始值来做到这一点,但在其核心 MVC 中包含 HTTP 的无状态性并没有做到这一点。

于 2013-10-16T16:30:42.927 回答
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);
    }

但如果有更好的解决方案,我会很高兴听到。谢谢你。

于 2013-10-16T16:51:24.233 回答
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);
}

可能有更好的方法可以做到这一点,但它适用于特定实体。

于 2014-01-27T21:59:14.127 回答