【发布时间】:2014-12-06 19:03:42
【问题描述】:
我正在我的网站上预加载产品数据,因为我需要它可以快速访问,并且希望在应用程序启动时加载一次,而不是在请求时加载。这是确保快速加载的一种方法。我通过将我的产品实体与其他一些实体一起加载并将它们存储在内存中来实现这一点。
然后我有类似以下的东西来检索我的数据:
public override IEnumerable<Product> Get()
{
var result = _cacheManager.Get(PreLoadCacheKey) as IEnumerable<Product>;
if (result != null)
return result;
return base.Get();
}
我面临的问题是,我使用依赖注入,我不控制我的数据上下文的范围(除了将它设置为 InstancePerRequest() 并保持不变)所以当我缓存我的实体时它们仍然有对原始上下文的引用。
我尝试了各种方法,但似乎无法解决以下问题:
The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
当尝试将从缓存中检索到的实体附加到我添加到数据库中的新实体时。
我尝试过的事情:
- 使用
AsNoTracking()检索数据 - 循环遍历所有结果,然后将它们添加到缓存中,并从当前上下文中
Detaching,然后在从缓存中检索时将它们附加到新上下文中。
理想情况下,我希望能够从实体的一侧将上下文与实体分离,这样我就可以查看实体是否附加到当前上下文,如果没有,将其与旧上下文分离并附加它到新的。不过,从我所看到的情况来看,唯一可以分离它的方法是引用我不会拥有的旧上下文。
我是否遗漏了一些明显的东西?
编辑
这是我将实体附加到另一个上下文的一个示例:
var orderLine = order.Lines.FirstOrDefault(ol => ol.Product.Id == product.Id) ?? new SalesOrderLine();
orderLine.Price = price.Price;
orderLine.Product = product; //This is my cache'd entity.
orderLine.ProductPriceType = price.ProductPriceType;
orderLine.Quantity += qty;
order.Customer = customer;
order.Lines.Add(orderLine);
order.Status = SalesOrderStatus.Current;
Update(order);
SaveChanges();
就目前而言,我正在强制加载未缓存的版本以解决此问题。
【问题讨论】:
-
请显示引发此异常的代码。您在哪里将
Product关联到另一个实体?
标签: c# entity-framework caching entity-framework-6 datacontext