如何使用MVC和EF检查属性的原始值

时间:2013-08-26 18:18:13

标签: asp.net-mvc entity-framework asp.net-mvc-4

需要将原始值与当前值进行比较,以便在保存更改之前对对象进行一些更新。如何获取对象的原始值?以下不起作用:

public ActionResult Edit(int id = 0)
{
    Project project = db.Projects.Find(id);
    ...
    db.Projects.Attach(project);  // ATTACH here
    ...
 }

 [HttpPost]
 public ActionResult Edit(Project project)
 {
     if (ModelState.IsValid)
     {
        db.Entry(project).State = EntityState.Modified;  // The STATE was DETACHED here...
        ...
  }

这是配置问题,还是我错过了什么?在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您的解决方案的问题是控制器的生命周期。 By default a new instance of the controller is generated for each client request。这意味着您需要在POST方法中加载原始值,因为您无法共享上下文的实例。

我在@ Gerard的评论

之后编辑了代码示例
[HttpPost]
public ActionResult Edit(Project project)
{
     if (ModelState.IsValid)
     {
         var original_value = db.Projects.Find(project.ProjectId);
         or
         var original_value_detached = db.Projects.AsNoTracking().Where(P => P.ProjectId == project.ProjectId).FirstOrDefault();
     }
 }

或者您编写自己的控制器工厂实现以在两个请求之间共享上下文,但您应该考虑来自不同客户端的请求。您可以找到示例here

答案 1 :(得分:0)

看起来你正在实现并发。可能是,您可以尝试使用DbUpdateConcurrencyException捕获更改。像这样:

try
        {
            ...
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            var entry = ex.Entries.Single();
            var dbValue = (Project)entry.GetDatabaseValues().ToObject();
            if(dbValue.State == EntityState.Modified)
            {
             //***your code
             }
        }