使用DBContext Entry.OriginalValues和Entry.NewValues记录更改的值

Kat*_*e R 2 asp.net-mvc entity-framework edit dbcontext

我有一个文档库站点,想要在编辑文档对象时发送电子邮件,其中包含更改的摘要.

数据库交互是使用DBContext的Code First Entities Framework

这是我到目前为止:

    [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");

        }
Run Code Online (Sandbox Code Playgroud)

但是,OriginalValue和NewValue始终相同 - 更新的值.

有什么方法,缺少像写入文件那样的hacky,在POST之前捕获文档的状态?

Sla*_*uma 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");
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)