Asp.net mvc 如何在get操作中缓存实体,在POST操作中缓存实体而无需数据库往返?
作为一个例子,我将如何使其在下面的代码中,POST操作可以获得get操作中缓存的实体 Intellisense告诉我,Asp.net mvc 如何在get操作中缓存实体,在POST操作中缓存实体而无需数据库往返?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,作为一个例子,我将如何使其在下面的代码中,POST操作可以获得get操作中缓存的实体 Intellisense告诉我,DbSet.Find()将在访问数据库之前检查上下文以查看实体是否已缓存。在这种情况下,POST操作中的DbSet.Find()会命中数据库,这意味着不会缓存任何内容。那么,GET操作和POST操作之间发生了什么变化,实体消失了 我真的需要再次从数据库中提取一个实体来删除它吗 public class UserController : Controller { priva
DbSet.Find()
将在访问数据库之前检查上下文以查看实体是否已缓存。在这种情况下,POST操作中的DbSet.Find()
会命中数据库,这意味着不会缓存任何内容。那么,GET操作和POST操作之间发生了什么变化,实体消失了
我真的需要再次从数据库中提取一个实体来删除它吗
public class UserController : Controller
{
private testContext db = new testContext();
// GET: /User/Delete/5
public ActionResult Delete(int id = 0)
{
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return View(user);
}
// POST: /User/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
User user = db.Users.Find(id);
db.Users.Remove(user);
db.SaveChanges();
return RedirectToAction("Index");
}
}
要在不往返数据库的情况下删除,可以执行以下操作:
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
User user = new User {UserID = id};
db.Users.Attach(user);
db.Users.Remove(user);
db.SaveChanges();
return RedirectToAction("Index");
}
要在不往返数据库的情况下删除,可以执行以下操作:
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
User user = new User {UserID = id};
db.Users.Attach(user);
db.Users.Remove(user);
db.SaveChanges();
return RedirectToAction("Index");
}
你确定它没有缓存在数据库中,从而命中数据库并检索缓存结果吗?可能,但我的观点是,为什么它在上下文中不可用?你确定它没有缓存在数据库中,从而命中数据库并检索缓存结果吗?可能,但我的观点是,为什么它在上下文中不可用,因为它应该是可用的。我并不是真的试图自己做缓存。我只是想以它应该工作的方式使用EF(根据文档)。DbSet.Local属性允许您访问缓存的实体,GET操作中的计数为1,而POST操作中的计数为0。@comenica我编辑了我的答案,以说明如何在不往返数据库的情况下删除。没有缓存的原因是上下文在每个HTTP请求结束时被破坏。如果您要请求相同的对象,在相同的请求中使用相同的数据上下文,Entity Framework确实会在该点缓存它,并且会阻止访问数据库。是的,我想一定是这样。我认为,因为上下文在类级别,所以所有操作都将使用相同的上下文。有点困惑。我明天会试一试。在有状态应用程序(如桌面应用程序)中,您是对的。上下文将一直存在,直到您使用它做了一些事情(即退出应用程序、处理类等)。但是,由于控制器是一个基于每个web请求构建的类,所以上下文只针对单个HTTP web请求,我并不是真的尝试自己进行缓存。我只是想以它应该工作的方式使用EF(根据文档)。DbSet.Local属性允许您访问缓存的实体,GET操作中的计数为1,而POST操作中的计数为0。@comenica我编辑了我的答案,以说明如何在不往返数据库的情况下删除。没有缓存的原因是上下文在每个HTTP请求结束时被破坏。如果您要请求相同的对象,在相同的请求中使用相同的数据上下文,Entity Framework确实会在该点缓存它,并且会阻止访问数据库。是的,我想一定是这样。我认为,因为上下文在类级别,所以所有操作都将使用相同的上下文。有点困惑。我明天会试一试。在有状态应用程序(如桌面应用程序)中,您是对的。上下文将一直存在,直到您使用它做了一些事情(即退出应用程序、处理类等)。但是,由于控制器是基于每个web请求构建的类,因此上下文只针对单个HTTP web请求。