我有一个网络应用程序。它对小表和一些写操作执行TON数据读取。我想将整个数据表拉入缓存,并查询缓存的数据。我覆盖了上下文的表<T>
()方法,因此我们可以提供缓存而不是实时数据。适用于插入,也支持单元测试数据访问。真棒。
因此我们开始使用缓存数据并发现更新和删除不起作用。
我们从db中提取一个对象,将其抛入List <T>
,将该列表放入httpCache中,然后删除数据上下文。
稍后两个请求,我们调用重写的表<T>
,它获取列表,并将对象拉出。我们更改它然后需要将缓存的,然后更改的对象附加到db上下文。所以我们调用myContext.Attach(myobject)和..... BOOM
已尝试附加或 或许,添加一个非新的实体 从另一个装载 DataContext的。这不受支持。
有没有解决这个限制的方法?
答案 0 :(得分:1)
听起来您的缓存实体仍然附加到原始DataContext ,以便查询它们。解决此问题的一种方法(打破了保持DataContext生命周期简短的最佳实践规则)是将DataContext与实体一起缓存,然后在要删除或更新缓存实体时使用该缓存上下文。
你提到缓存的实体被用于“两个请求之后” - 如果这些请求都在短时间内发生,那么打破短生命周期规则可能不是问题。
另一种选择是缓存基于实体但不实体的对象,以及何时更新具有存储在缓存非实体中的值的实体对象,在新的DataContext上查询干净的实体,更新这些实体,然后保存在新创建的DataContext上。
还有其他方法可以做到 - 我发现这本书LINQ in Action非常有助于处理这类案件。