数据库不更新MVC中的模型

时间:2011-06-06 15:43:25

标签: asp.net asp.net-mvc entity-framework sql-server-ce

所以我刚刚开始使用ASP.NET MVC,我真的很喜欢它,除了我似乎有一个奇怪的诀窍遇到最离奇的错误。我正在为自己制作一个简单的博客应用程序。我有两个简单的模型:postcomment。我有一个部分视图,用于创建嵌入在每个帖子的详细信息视图中的注释。当我提交表单来更新评论时,它会转到我的CommentsController的创建操作,看起来像......

    [HttpPost]
    public ActionResult Create(comment comment)
    {
        comment.date = DateTime.Now;
        if (ModelState.IsValid)
        {
            post p = db.posts.Find(comment.post); //I've verified that comment.post is coming in
            if (p.comments == null) p.comments = new List<comment>();
            p.comments.Add(comment);
            db.Entry(p).State = EntityState.Modified; //I'm using this line since that's how its done in the edit actionmethod of the BlogController. I was just updating db.posts.Find(... manually, but that wasn't workign either.
            db.comments.Add(comment);
            db.SaveChanges();
            return RedirectToAction("Details", "Blog", new  { id = comment.post });
        }

        return PartialView(comment);
    }

问题是,当评论被添加到数据库中时,帖子不会更新。当我在保存更改之前检查p时,它已更新,但显然它实际上从未实际提交到数据库,因为当我重定向到详细信息时,那些注释不存在。我的代码有什么明显的错误吗?我错过了.NET或MVC的一些基本原理吗?如果我需要提供更多代码或上下文,请告诉我。

有趣的注意:无论如何,post.comments似乎总是为空。我在创建帖子时将其设置为空列表,但它似乎仍然返回null。不知道这是否只是试图存储空列表或者是否与我的问题有关。再一次,lemme知道,我会在这里粘贴所需的任何东西。

谢谢!

2 个答案:

答案 0 :(得分:3)

也许保存更改工作正常但您没有看到保存的评论到帖子,因为您在显示帖子时没有加载它们。您可以在操作中急切加载帖子的评论,其中会显示如下帖子:

post p = db.posts
    .Include(p1 => p1.comments)
    .Where(p1 => p1.Id == id)
    .SingleOrDefault();

我还认为您可以简化您的创建操作:

[HttpPost]
public ActionResult Create(comment comment)
{
    comment.date = DateTime.Now;
    if (ModelState.IsValid)
    {
        db.comments.Add(comment);
        db.SaveChanges();

        return RedirectToAction("Details", "Blog", new  { id = comment.post });
    }

    return PartialView(comment);
}

如果comment.post是对相关帖子发表评论的外键,这应该有效。 (由于Find(comment.post)

,您的代码就是这种情况

答案 1 :(得分:0)

虽然@Slauma引导我使用我的解决方案,但我只是发布了我用于未来参考的最终代码(感谢@George Stocker)

    public ActionResult Create(comment comment)
    {
        comment.date = DateTime.Now;
        if (ModelState.IsValid)
        {
            db.comments.Add(comment);
            db.SaveChanges();
            return RedirectToAction("Details", "Blog", new  { id = comment.post });
        }

        return PartialView(comment);
    }

并检索评论......

    public ActionResult Details(int id)
    {
        var post = (from p in db.posts
                     where p.id == id
                     select new { p.id, p.title, p.content, p.date, p.tag, comments = (from c in db.comments where c.post == id select c) }).SingleOrDefault();

        post p2 = new post(post.id, post.title, post.content, post.date,post.tag, post.comments.ToList());
        return View(p2);
    }