0

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

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...
        ...
  }

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

4

2 回答 2

1

您的解决方案的问题是控制器的生命周期。默认情况下,会为每个客户端请求生成一个新的控制器实例。这意味着您需要在编辑的 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();
     }
 }

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

于 2013-08-26T18:37:12.807 回答
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
             }
        }
于 2013-08-26T19:33:21.220 回答