我正在使用Linq to Sql查询某个数据库,我只使用Linq从数据库中读取数据,并通过其他方式对其进行更改。 (这不能改变,这是我们正在扩展的应用程序的限制,所有更新必须通过其sdk)。
这很好,但是我遇到了一些缓存问题,基本上,我使用Linq查询一行,然后我通过外部方式删除它,然后我在外部创建一个新行,如果我再次使用linq查询该行获得旧的(缓存)数据。
我无法关闭对象跟踪,因为这似乎阻止了数据上下文自动加载相关属性(外键)。
有没有办法清除DataContex缓存?
我找到了一种方法,但似乎并不安全:http://blog.robustsoftware.co.uk/2008/11/clearing-cache-of-linq-to-sql.html
你怎么看?我有什么选择?。答案 0 :(得分:20)
如果您想刷新特定对象,那么Refresh() method可能是您最好的选择。
像这样:
Context.Refresh(RefreshMode.OverwriteCurrentValues, objectToRefresh);
如果您需要一次刷新多个对象,也可以传递一个对象数组或一个IEnumerable作为第二个参数。
我在评论中看到你在说什么,在反射器里你看到里面发生了这种情况.Refresh():
object objectByKey = context.Services.GetObjectByKey(trackedObject.Type, keyValues);
if (objectByKey == null)
{
throw Error.RefreshOfDeletedObject();
}
您链接的方法似乎是您的最佳选择,DataContext类不提供任何其他方法来清除已删除的行。处理检查等都在ClearCache()
方法内...它实际上只是检查处理并在下面的ResetServices()
上调用CommonDataServices
..唯一的不良影响将是清除任何待处理的已排队的插入,更新或删除。
还有一个选项,你能为你正在做的任何操作启动另一个DataContext吗?它不会有任何缓存......但这确实涉及一些计算成本,因此如果挂起的插入,更新和删除不是问题,我会坚持使用ClearCache()
方法。
答案 1 :(得分:1)
我使这段代码真正清除了“缓存”实体,将其分离。
var entidades = Ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);
foreach (var objectStateEntry in entidades)
Ctx.Detach(objectStateEntry.Entity);
Ctx是我的背景。
答案 2 :(得分:0)
您应该能够重新查询使用此对象的结果集。这不会拉出缓存集,但实际上会返回最终结果。我知道这可能不那么简单或可行,具体取决于您如何设置应用程序......
HTH。