Asp.net mvc 如何在get操作中缓存实体,在POST操作中缓存实体而无需数据库往返?

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

作为一个例子,我将如何使其在下面的代码中,POST操作可以获得get操作中缓存的实体

Intellisense告诉我,
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请求。