5

我正在尝试使用 HttpContext 缓存来缓存实体。我在服务层的代码如下

public Product GetById(long id)
{
  Product product;
  string storageKey = string.Format("products_{0}",id.ToString());
  product = (Product)HttpContext.Current.Cache.Get(storageKey);
  if (product == null)
  {
     product = _productContext.Products.Find(id);
      HttpContext.Current.Cache.Insert(storageKey, product);
  }     
  return product;
}

并像这样在客户端中使用:

 ProductService productServices = new ProductService(_dbContext);
 var product = productServices.GetById(id);
  //... Populating controls

 //On Update button click
  ProductService productServices = new ProductService(_dbContext);
  var product = productServices.GetById(id);
  //Updating values of product and saveChanges.

在获得该项目时,它工作正常。但是当我在更新后尝试保存该项目时出现此错误:

一个实体对象不能被多个 IEntityChangeTracker 实例引用。

我知道这是由于使用不同的 DbContexts 进行检索和更新。使用时没有缓存它的工作正常。有没有更好的其他方法在实体框架中进行缓存?

4

1 回答 1

2

尝试将缓存的产品附加到当前上下文:

public Product GetById(long id)
{
   Product product;
   string storageKey = string.Format("products_{0}",id.ToString());
   product = (Product)HttpContext.Current.Cache.Get(storageKey);
   if (product == null)
   {
      product = _productContext.Products.Find(id);
      HttpContext.Current.Cache.Insert(storageKey, product);
   }
   else
   {
       _productContext.Products.Attach(product);
   }
   return product;
}

此外,如果您使用的是 Asp.Net MVC,请考虑使用输出缓存来缓存控制器操作返回的内容。

于 2013-09-26T11:53:16.193 回答