2012-02-03 18 views
2

我有一个文档库站点,并且希望在编辑文档对象时发送电子邮件,其中包含更改的摘要。使用DBContext Entry.OriginalValues和Entry.NewValues录制更改的值

数据库交互使用的DbContext

代码第一次实体框架这是我到目前为止有:

[HttpPost] 
    public ActionResult Edit(Document document, bool sendEmail, string commentsTextBox) 
    { 

     if (ModelState.IsValid) 
     { 
      docsDB.Entry(document).State = EntityState.Modified; 

      foreach (string propertyName in docsDB.Entry(document).OriginalValues.PropertyNames) 
      { 
       var OriginalValue = docsDB.Entry(document).OriginalValues.GetValue<object>(propertyName); 
       var NewValue = docsDB.Entry(document).CurrentValues.GetValue<object>(propertyName); 
       if (!OriginalValue.Equals(NewValue)) 
       { 
        //capture the changes 
       } 
      } 

      docsDB.SaveChanges(); 
      if (sendEmail) 
      { 
       //sends email 
      } 
      return RedirectToAction("Index"); 

     } 

然而,OriginalValue和newValue都是一样的 - 更新的值。

有没有什么办法能够像写入文件一样,在POST之前捕获文档的状态?

回答

5

为了将更新后的属性与数据库中的值进行比较,您必须从数据库中重新加载文档。你可以这样试试:

[HttpPost] 
public ActionResult Edit(Document document, bool sendEmail, 
    string commentsTextBox) 
{ 
    if (ModelState.IsValid) 
    { 
     var documentInDB = docsDB.Documents.Single(d => d.Id == document.Id); 

     docsDB.Entry(documentInDB).CurrentValues.SetValues(document); 

     foreach (string propertyName in docsDB.Entry(documentInDB) 
             .OriginalValues.PropertyNames) 
     { 
      var OriginalValue = docsDB.Entry(documentInDB) 
           .OriginalValues.GetValue<object>(propertyName); 
      var NewValue = docsDB.Entry(documentInDB) 
          .CurrentValues.GetValue<object>(propertyName); 

      if (!OriginalValue.Equals(NewValue)) 
      { 
       //capture the changes 
      } 
     } 

     docsDB.SaveChanges(); 
     if (sendEmail) 
     { 
      //sends email 
     } 
     return RedirectToAction("Index"); 
    } 
    // ... 
} 
+0

非常感谢!这解决了这个问题。 – 2012-02-07 18:26:39