控制器方法不更新(每次都是相同的结果)

时间:2013-11-27 00:58:16

标签: c# asp.net-mvc

我的mvc控制器中有以下方法:

[HttpGet]
public ActionResult UserProfile(String username)
{
     var user = db.Users.Find(username);

     return View(user);
}

此函数返回包含用户个人资料的视图。但无论数据库的变化如何,结果都是一样的。

当我调试时,似乎db根本没有变化,而在其他控制器中,一切正常。

编辑: 我做出更改时的位置

public ActionResult ExecuteRetreive(String username, String ISBN)
    {
        if (IsValid(username))
        {
            var resBook = db.Books.Find(ISBN);
            var resUser = db.Users.Find(username);
            var resRentedBooks = (from rb in db.RentedBooks
                                  join b in db.Books on rb.ISBN equals b.ISBN
                                  where b.ISBN == ISBN
                                  where rb.Login == username
                                  where rb.Returned == null
                                  select rb).FirstOrDefault();
            if (resRentedBooks == null)
            {
                return RedirectToAction("Fail", "FailSuccess",
                                        new { error = "" });
            }

            resRentedBooks.Returned = DateTime.Now;

            resBook.IsRented = false;
            resUser.RentedBooks--;

            db.SaveChanges();

            return RedirectToAction("Success", "FailSuccess");
        }
        else
        {
            return RedirectToAction("Fail", "FailSuccess",
                new { error = "Niepoprawna nazwa użytkownika" });
        }
    }

我是新手,所以不要嘲笑我的代码:P当我显示resUser.RentedBooks--;时,它每次都是一样的。

1 个答案:

答案 0 :(得分:2)

作为@JeroenVannevel在评论中所说的后续内容,您可能遇到的另一个问题是因为您正在使用静态上下文(以及我过去必须处理的上下文),特定DbContext已经加载了一个实体(或一组实体,在我的情况下),它不会因为在数据库中进行了一些外部更改而倾向于刷新。它会将这些实体加载到Local中,并在您查询时自动引用这些实体。

然后,解决方案是始终将DbContext个调用封装在using块中,因为DbContext实现了IDisposable

这种方法需要注意一点,因为你正在使用MVC:如果你正在使用延迟加载,并且你知道你的View需要来自子对象的一些信息(或列出一个子集合的名称)在你离开using块之前,你绝对需要在之前保存那些子实体,否则你会发现自己得到的异常说明你的上下文已被处理掉了。