0

このフォーラムの優れたヘルプに続いて、複数のレコード/モデルが一度にポストバックされる MVC コントローラーで、データベース内のデータを更新するのにこれが最善の方法であるかどうかを誰でも確認できますか?

[HttpPost]
public ActionResult Edit(ObjectivesEdit model)
{
    if (model.Objectives != null)
    {
        // model will have several records posted back - so loop through each one, and update the database
        foreach (var item in model.Objectives)
        {
            // find the database row
            Objective objective = db.objectives.Find(item.ID);

            // Set the database row to the posted values
            objective.objective = item.objective;
            objective.score = item.score;
            objective.possscore = item.possscore;
            objective.comments = item.comments;
        }
        // Save the changes to the database
        db.SaveChanges();
    }
    return View(model);
}

おそらくより良い作業方法があると思う部分は次のとおりです。

objective.objective = item.objective;
objective.score = item.score;
objective.possscore = item.possscore;
objective.comments = item.comments;

それをより合理化されたものに置き換えることができますか、それともこれを行う方法ですか?

4

3 に答える 3

1

データベースの更新または追加には、リポジトリパターンを使用することをお勧めします。

以下のリンクを見てください

https://codereview.stackexchange.com/questions/6266/asp-net-mvc-using-repository-pattern-code-review

于 2012-05-30T14:01:40.610 に答える
0

次のようなラムダ式を使用する以外:

var employees = data.Employees.Where(em => em.City.StartsWith("B")).ToList();
employees.ForEach(em => em.City = "ABC");

(上記はここから取得)

現在行っているように、ループでレコードを更新する必要があります。上記はまだループですが、内部で実行されることに注意してください(少しきれいに見えます)。

于 2012-05-30T13:49:27.693 に答える
0

あなたのコードで私が目にする最大の問題は、返されるすべてのレコードに対してデータベースにヒットする可能性があることです。また、フォーム上にオブジェクト全体を保持している場合、マッピングは完全には必要ありません

したがって、必要なすべてのオブジェクトを 1 つのクエリでクエリする必要があります。

var Objectives = db.Objectives.where(o => model.Objectives.select(ob => ob.ID).Contains(o.ID));

これにより、コントローラー アクションにポストされたすべてのオブジェクティブがデータベースから返されます。

次に、 foreach 変更内

Objective objective = db.objectives.Find(item.ID);

Objective objective = Objectives.First(o => o.ID == item.ID);

次に、マッピングを続行します

データベースへの旅行を常に最小限に抑えるようにしてください

于 2012-05-30T14:20:04.283 に答える