База данных не обновляет модель в MVC - PullRequest
0 голосов
/ 06 июня 2011

Так что я только начал использовать ASP.NET MVC, и он мне действительно нравится, за исключением того, что у меня, кажется, есть странная ловкость, чтобы встречаться с самыми странными ошибками.Я делаю простое приложение для ведения блога для себя.У меня есть две простые модели: post и comment.У меня есть частичное представление для создания комментария, который встроен в подробное представление для каждого сообщения.Когда я отправляю форму для обновления комментария, она переходит к действию создания моего 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 всегда кажется нулевым.Я установил его в пустой список при создании сообщения, но, похоже, он все равно возвращается в ноль.Не уверен, если это просто результат попытки сохранить пустой список или это связано с моей проблемой, хотя.Опять же, дай мне знать, и я воткну здесь все, что нужно.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Возможно сохранение изменений работает нормально, но вы не видите сохраненные комментарии к сообщению, потому что вы не загружаете их при отображении сообщения. Вы можете загрузить комментарии к сообщению в своем действии, которое отображает сообщение следующим образом:

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))

0 голосов
/ 07 июня 2011

В то время как @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);
    }
...