【问题标题】:How do I get Linq-to-SQL to refresh its local copy of a database record?如何让 Linq-to-SQL 刷新其数据库记录的本地副本?
【发布时间】:2020-03-28 14:30:12
【问题描述】:

假设我的数据库中有一个 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存储的proc修改了订单(当然很有可能)我会遇到并发冲突,因为L2S会检测到订单记录发生了变化,并且提交失败该订单的更改。

这一切都很合乎逻辑,但是如果我想要在调用存储过程后更新订单记录怎么办?我如何告诉 L2S 忘记它的缓存副本并从数据库中刷新它?

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    您可以在数据上下文中使用 Refresh 方法,如下所示:

    DataContext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues,
                        DataContext.Orders);
    

    【讨论】:

    • 完美。我看到我也可以指定一个特定的订单记录,这正是我需要的。谢谢!
    • 但它不会更新映射到另一个表的关联导航集合属性。它仅更新映射到当前实体指向的表的列的属性。有办法解决吗?
    【解决方案2】:

    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) 就会刷新。

    【讨论】:

    • 嗯...方法不公开的事实会让我暂停...
    • 是的。我用的不多,但到目前为止没有问题。谨慎使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多