实体框架中未更新数据

时间:2013-12-08 15:14:55

标签: c# entity-framework asp.net-mvc-4 many-to-many relational-database

我的数据库实体模型中有三个表:

Models

我可以在帖子中添加多个类别。因此,表格可以多对多。

我可以添加一个包含多个类别的新帖子。没问题。

CreatePost行动:

    [HttpPost]
    public ActionResult CreatePost(Post post, int[] categories)
    {
        post.CreatedDate = DateTime.Now;
        foreach (var category in categories)
        {
            post.Categories.Add(db.Categories.Find(category));
        }
        db.Posts.Add(post);
        db.SaveChanges();
        // Get categories from ListBox
        ViewData["Categories"] = new MultiSelectList(db.Categories.Select(c => new CategoryViewModel()
        {
            CategoryId = c.CategoryId,
            CategoryName = c.Name
        }), "CategoryId", "CategoryName");
        return View(post);
    }

但我无法从帖子中更新类别。我无法得到错误,但它无法正常工作。

EditPost

    [HttpPost, ActionName("EditPost"), ValidateInput(false)]
    public ActionResult EditPost(Post post, int[] categories)
    {
        ViewData["Categories"] = new MultiSelectList(db.Categories.Select(c => new CategoryViewModel()
        {
            CategoryId = c.CategoryId,
            CategoryName = c.Name
        }), "CategoryId", "CategoryName");

        post.CreatedDate = DateTime.Now;
        // Clear all categories.
        post.Categories.Clear();
        foreach (var category in categories)
        {
            // Add new categories.
            post.Categories.Add(db.Categories.Find(category));
        }
        db.Entry(post).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Posts");
    }

编辑帖子时,类别不会更新。我没有得到任何错误。我怎样才能做到这一点?请帮助..

2 个答案:

答案 0 :(得分:1)

原因是在EF可以跟踪对它的更改之前必须加载post.Categories

db.Entry(post).State = EntityState.Modified; // Also attaches post to the context
db.Entry(post).Collection(p => p.Categories).Load();

// Clear all categories.
post.Categories.Clear();
// and so on

顺便说一下,如果帖子更新而未创建,您确定post.CreatedDate = DateTime.Now;吗?

答案 1 :(得分:0)

保存任何内容的可能原因是SaveChanges没有找到任何保存更改。因此,它什么都不做,并且没有错误消息。

尝试在添加类别之前将帖子附加到上下文。或者在类别上设置状态:

foreach (var cat in post.Categories)

  this.Entry(cat).State = EntityState.Modified;