如何让Linq-to-SQL刷新其数据库记录的本地副本?

时间:2010-04-07 13:37:05

标签: linq-to-sql

假设我的数据库中有一个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忘记缓存副本并从数据库刷新它?

2 个答案:

答案 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),它将刷新。