【问题标题】:How can I tell datacontext I've updated a record via stored procedure如何告诉 datacontext 我已经通过存储过程更新了记录
【发布时间】:2009-04-30 06:25:06
【问题描述】:

我有一个存储过程来更新记录,运行它后我使用 LinqToSql 删除记录。我知道这很奇怪,但我只是想测试一下 datacontext 的智能程度并了解它是如何工作的。

由于数据上下文缓存了结果,因此可以记录通过它进行的任何更改,但现在我使用存储过程来更新某些内容,它不会知道。因此,当我尝试删除它时,会出现“未找到或更改行”的异常。

如何告诉数据上下文我更新了什么?如果我能这样做,问题就会解决。

【问题讨论】:

    标签: linq-to-sql datacontext


    【解决方案1】:

    您可以使用传入 System.Data.Linq.RefreshMode 枚举的 DataContext Refresh() 方法;这是一个例子:

    NorthWindDataContext context = new NorthwindDataContext();
    context.Refresh(RefreshMode.KeepChanges);
    

    澄清:
    http://msdn.microsoft.com/en-us/library/system.data.linq.refreshmode.aspx">RefreshMode 枚举有 3 个值:

    1. 保持更改
    2. 保持当前值
    3. 覆盖当前值

    此处使用的版本 (KeepChanges) 强制 Refresh 方法保留修改后的值,并通过数据库中的值更新其他未修改的值。

    【讨论】:

      【解决方案2】:

      我想我遗漏了一些东西,但如果你知道你的存储过程只是删除了记录,那么为什么还要在事后打扰 Linq2Sql 呢? DataContext 不会神奇地知道删除。

      【讨论】:

      • 对不起,我没有说明我的情况。我的存储过程不知道我接下来要做什么,但我知道我的 sp 已经更新了数据库中的某些内容,所以在运行 sp 之后,我只想告诉 datacontext 我已经更新了一些内容,请同步我的更改。跨度>
      • 在存储过程执行并删除您的记录后,您对 DataContext 做了什么?你能发布更多细节吗?
      • 有一件事我的sp不会删除记录,只是更新一些东西。例如我使用 dc.SP_NAME 更新某些内容,然后我可以删除刚刚通过 LingToSql 更新的记录,例如 var item = dc.TableName.where(p=>p.Id == id).First(); dc.TableName.DeleteOnSubmit(item); dc.SubmitChanges();只要 dc 执行 submitchanges,就会抛出异常“Row not found or changed”。所以我只想在运行 sp 之后和取出项目之前插入一些东西来通知 dc 我已经做了这样的改变,请更新自己 2
      • 因为我的 dc 在单个 Web 请求期间共享,所以我想,我可以在运行我的 sp 后创建一个新的 datacontext 并处理旧的 datacontext。所以下一个动作或请求将开始使用新的数据上下文,所以新的数据上下文知道我所做的更改,因为它是在我的更改之后
      • 如果你运行你的 Linq“查询”代码: var item = dc.TableName.Where(p => p.Id == id).First() 在你执行 SP 之后,那么你应该没事的。如果您在运行 SP 之前执行它,那么是的,DataContext 不知道更改。您必须创建一个新的 DataContext 或者可能有一个内置于 Linq2Sql 中的方法来通知 DataContext 重新加载,但不幸的是我不知道它是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多