使用EF“适用于所有人”的有效方式

时间:2013-01-30 19:41:22

标签: c# asp.net-mvc entity-framework

我有一个搜索页面,允许用户搜索项目并向项目添加详细信息。我正在努力允许用户将相同的细节应用于多个项目。用户将检查他要应用相同更改的所有项目,然后单击Comment按钮。这将发送已检查的项目列表List<int> ids并单击特定项目(以便在已存在的情况下用作模板)int id

从这里,用户将根据自己的意愿编辑评论并保存。 HttpPost Edit行动将如何展现?如果该项目不存在,则需要向数据库添加注释,否则覆盖存在的注释。以下是我的想法(基本概要)。我看到的问题是它需要为我想要应用更改的每个项目戳数据库。必须有更好的方法来做到这一点。

[HttpPost]
public ActionResult Edit(CommentVM model)
{
    if (ModelState.IsValid)
    {
        foreach(int i in model.ids)
        {
            Comment comment = _db.Comments.Find(i);
            if(comment == null){
                //Create and add
            {
            else{
                comment.Text = model.Text;
                _db.Entry(comment).State = EntityState.Modified;
            }
        }

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

2 个答案:

答案 0 :(得分:0)

  

我看到的问题是它需要戳数据库   对于我想要应用更改的每个项目。

你不用担心这个。保存更改时,将调用一次数据库。循环仅影响内存中的对象。至于你的代码,你似乎走在正确的轨道上,但我确实有一个潜在的建议。鉴于您修改或创建评论的不同步骤,我假设您已将评论编写并存储为不同的实体,这些实体通过ID链接到您的项目。如果是这种情况,我建议制作&#34;评论&#34;该项的属性,这样您只需写入属性并简化整个过程。

答案 1 :(得分:0)

我最终使用了一种自制方法。由于两种情况(添加条目和编辑条目需要单独处理,我这样处理它们。

List<int> InDB = _db.Comments           
    .Where(r => model.ids.Contains(r.id))
    .Select(r => r.id)
    .ToList();

List<int> diff = model.ids.Except(InDB).ToList();
//Loop through items to ADD
foreach (int i in diff)
{
    Comment comment = new Comment { Text = model.Text, id = i };
    _db.Comments.Add(comment);
}
//Loop through items to edit
foreach (int i in InDB)
{
    Comment comment = new Comment { Text = model.Text, id = i };
    _db.Entry(comment).State = EntityState.Modified;
}