我的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--;
时,它每次都是一样的。
答案 0 :(得分:2)
作为@JeroenVannevel在评论中所说的后续内容,您可能遇到的另一个问题是因为您正在使用静态上下文(以及我过去必须处理的上下文),特定DbContext
已经加载了一个实体(或一组实体,在我的情况下),它不会因为在数据库中进行了一些外部更改而倾向于刷新。它会将这些实体加载到Local
中,并在您查询时自动引用这些实体。
然后,解决方案是始终将DbContext
个调用封装在using
块中,因为DbContext
实现了IDisposable
。
这种方法需要注意一点,因为你正在使用MVC:如果你正在使用延迟加载,并且你知道你的View需要来自子对象的一些信息(或列出一个子集合的名称)在你离开using
块之前,你绝对需要在之前保存那些子实体,否则你会发现自己得到的异常说明你的上下文已被处理掉了。