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();
    }
}

この例は、Data Model First アプローチを使用して Entity Framework を使用して MVC 3 でエンティティを編集する適切な方法から取られましたか?

列の監査を行っているため、変更された列のみを 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

更新するフィールドを 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 に答える
1

ベスト プラクティスは、ドメイン/データ モデルではなく ViewModel を使用して、ビューとの間で受け渡しすることです。:)

このシナリオは、そうしないことの危険性の 1 つを示しています。

于 2014-08-08T18:40:29.037 に答える
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 に答える