假设我的数据库中有一个Orders表,并且VS2008“Linq to SQL Classes”设计器生成了相应的模型类。假设我的数据库中还有一个存储过程(ProcessOrder
),用于对订单记录进行一些处理。
如果我执行以下操作:
var order = dataContext.Orders.Where(o => o.id == orderId).First();
// More code here
dataContext.ProcessOrder(orderId);
order.Status = "PROCESSED";
dataContext.SubmitChanges();
...如果ProcessOrder
存储过程修改了订单(当然很可能),我会得到并发冲突,因为L2S会检测到订单记录已经改变,并且会失败将更改提交给该订单。
这一切都是合乎逻辑的,但如果我希望在调用存储过程后更新订单记录怎么办?如何告诉L2S忘记缓存副本并从数据库刷新它?
答案 0 :(得分:16)
您可以使用数据上下文中的Refresh
方法执行此操作,如下所示:
DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues,
DataContext.Orders);
答案 1 :(得分:0)
DataContext.Refresh可以工作,但是非常慢。
一种更快的方法是使用以下方法清除DataContext缓存:
public static void ClearCache(this DataContext context)
{
const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
var method = context.GetType().GetMethod("ClearCache", FLAGS);
method.Invoke(context, null);
}
然后只需调用ClearCache(dataContext),它将刷新。