1

你好我有这样的事情:

public ActionResult Edit(int id)
{
    var movie = (from m in _db.Movies where m.Id == id select m).First();

    return View(movie);
}

[HttpPost]
public ActionResult Edit(Movie movie)
{
    try
    {
        var originalMovie = (from m in _db.Movies where m.Id == movie.Id select m).First();

        _db.Movies.ApplyCurrentValues(movie);

        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

此示例取自Proper way to Edit an entity in MVC 3 with the Entity Framework using Data Model First approach?

我想将仅修改的列传递给 DB SQL 查询(UPDATE Movie ....),因为我正在进行列审计。

代码工作正常,但问题是在我的“电影”实体中,我有一个“FlagOldMovie”属性和其他 10 个属性,我没有在这个视图中使用它,因为它们会保持不变,但是实体框架放在那个属性默认值,因此“ApplyCurrentValues”会发现更改并且属性也会更新。

一种解决方法是将我未更改的属性传递给 html 隐藏输入,而是传递其私有数据。

任何想法?

4

5 回答 5

3
[HttpPost]
public ActionResult Edit([Bind(Exclude ="column_name")] Movie movie)
{
//code here
}

这将忽略您指定的列,我通常这样做是为了排除Id.

但是,如果您忽略了许多列,那么您应该考虑 ViewModel 概念,其中您只有视图所需的属性。

编辑:还有一些问题吗?

这是添加多个的方法

[HttpPost]
public ActionResult Edit([Bind(Exclude ="c_name, c_name2, c_name3")] Movie movie)
{
//code here
}
于 2013-09-02T00:27:11.210 回答
1

最佳实践是使用 ViewModel 而不是域/数据模型来传递到视图/从视图传递。:)

这种情况说明了不这样做的危险之一。

于 2014-08-08T18:40:29.037 回答
1

您可以告诉 EF 您要更新哪些字段。尝试这样的事情:

_db.Movies.Attach(movie);
ObjectStateEntry entryToUpdate = db.ObjectStateManager.GetObjectStateEntry(movie);
entryToUpdate.SetModifiedProperty("field1"); // Replace "field1" with the name of the 1st field to update
entryToUpdate.SetModifiedProperty("field2"); // Replace "field2" with the name of the 2nd field to update
entryToUpdate.SetModifiedProperty("field3"); // Replace "field3" with the name of the 3rd field to update
_db.SaveChanges();
于 2013-09-02T08:45:58.257 回答
0

我终于明白了,首先,该解决方案仅适用于.NET 4.5+

[HttpPost]
public ActionResult Edit(Movie movie)
{
    try
    {
        //Get DB version
        var originalMovie = (from m in _db.Movies where m.Id == movie.Id select m).First();
        //Mark changes with data received
        _db.Movies.ApplyCurrentValues(movie);

        //CODE ADDED - Ignoring field/properties you dont want to update to DB
        ObjectStateEntry entryToUpdate = db.ObjectStateManager.GetObjectStateEntry(originalMovil);
        entryToUpdate.RejectPropertyChanges("field1");
        entryToUpdate.RejectPropertyChanges("field2");
        entryToUpdate.RejectPropertyChanges("field3");
        //-----------------

        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

使用此代码,唯一修改的数据是您想要的,接下来我所做的是审计列更改扩展 _db.SaveChanges() 到 _db.SaveChangesAudito(id);

于 2013-09-02T18:15:24.070 回答
0

尝试这样

var originalMovie = (from m in _db.Movies where m.Id == movie.Id select m).First();

originalMovie.updateme = updating;

_db.SaveChanges();
于 2013-09-02T00:12:32.700 回答