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

除了使用 lambda 表达式,例如:

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

(以上取自这里

您必须像当前那样循环更新记录。请注意,上面仍然是一个循环,但在内部执行(并且看起来更干净一些)。

于 2012-05-30T13:49:27.693 回答
0

我在您的代码中看到的最大问题是您可能会针对返回的每条记录访问数据库。此外,如果您在表单上持有整个对象,则映射不是完全必要的

所以你会想在一个查询中查询所有必要的对象

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 回答