【问题标题】:LINQ doesn't recognize changes in the databaseLINQ 无法识别数据库中的更改
【发布时间】:2009-10-15 07:47:50
【问题描述】:

我没有找到类似的东西,所以我不得不问:

我使用 LINQ to SQL 并且一切都很好,直到我开始使用存储过程来更新数据库条目。 (我的存储过程类似于更新 groupid x 的所有条目) 更新运行良好,数据库中的值发生变化。但是 DataContext 忽略了这种变化。

我不得不说数据上下文是一个单例,我知道这不是常见的方式,但我有不同的原因必须这样做。

所以

db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

没用。

为什么他不知道db的变化?

【问题讨论】:

    标签: sql linq linq-to-sql sql-update


    【解决方案1】:

    您正在尝试做的事情与 LinqToSql 的工作方式非常不符。

    使用长寿命的 DataContext 很难正确使用,尤其是在需要调用存储过程时,LinqToSql 无法轻松跟踪数据更改。

    通常会自动跟踪您通过 DataContext 所做的更改,因此 DataContext 可以正确管理其缓存并跟踪从该 DataContext 对数据库所做的更改。然而,情况并非总是如此。 DataContext 不(也不容易)理解您的存储过程在做什么,因此它不知道如何保持其缓存正确。此时,在调用存储过程之后,最好的选择是摆脱该 DataContext 并创建一个新的。这有效地清除了您的缓存,这可能会或可能不会对性能造成重大影响,但数据完整性应该是您的首要关注点。

    如果您的 Singleton DataContext 不是唯一修改数据库的东西(例如,您的数据库可能会被触发器、批处理、其他应用程序等修改),那么您的 DataContext 中也可能包含不准确的数据缓存,这是拥有短暂 DataContext 的另一个原因。

    因此,虽然您可能会通过长寿的 Singleton DataContext 取得成功,但您将全程与系统作斗争,而系统最终可能会获胜。

    您必须决定:数据完整性有多重要?

    【讨论】:

      【解决方案2】:

      因为数据上下文正在缓存值。这是一篇关于如何clear the cache 的文章。但是现在你有一个问题是实现一个知道何时清除它的通知系统。

      Microsoft 建议数据上下文应仅用于单个工作单元。将其作为单身可能挂在上面不是一个好主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多