LINQ 中的更新查询包含 WHERE 子句中的所有列,而不仅仅是主键列

2023-12-05

我正在使用 Linq 更新表中的单个列,请使用下面的虚构表格。

MyTable(PKID、ColumnToUpdate、SomeRandomColumn)

var row = (from x in DataContext.MyTable
           where b.PKID == 5
           select x).FirstOrDefault();

row.ColumnToUpdate = 20;
DataContext.SubmitChanges();

这会将专栏更新为预期的内容,这并不奇怪。但是,当我检查生成的 SQL 命令时,它会执行以下操作:

UPDATE [dbo].[MyTable ]
SET [ColumnToUpdate ] = @p2
WHERE ([PKID] = @p0) AND ([SomeRandomColumn] = @p1) 

这是执行更新,但前提是所有列都与实体期望的值匹配,而不是单独引用主键列。

如果数据库列被另一个进程更改,这在这个特定项目中是非常可行的;例如。在获取要操作的行、计算要设置值的更改以及以一批行形式发出更新命令之间存在一个窗口。在这种情况下,查询将引发异常,从而导致部分更新,除非我捕获、重新加载数据并重新发送单个查询。它还有一个缺点,即行信息可能非常大(例如,包含 HTML 标记),并且整个信息都会传递给 SQL,并在处理较大批次时减慢系统速度。

有没有办法让 Linq / Entity 仅根据Where 子句中的 PK 列发出更新命令?


I never used LINQ-to-SQL for production projects and I never were aware of it applying optimistic concurrency1 by default.

这是默认行为:

  1. If a table doesn't have a Timestamp/Rowversion column2, all columns have "Update Check" set to "Always" in the DBML (except primary key columns and computed columns, i.e. all updateable columns).
  2. 如果一个表确实有一个Timestamp/Rowversion列,该列在 DBML 中将“时间戳”设置为“True”,并且所有列的“更新检查”=“从不”。

“更新检查”或“时间戳”将列标记为并发令牌。这就是为什么在更新语句中您会在(不是)“随机”列上看到这些附加谓词。显然,您模型中的表格没有Timestamp/Rowversion列,因此更新会检查表中所有可更新列的值。


1 Optimistic concurrency: no exclusive locks are set when updating records, but existing values of all or selected columns are checked while updating. If one of those column value was changed by another user between getting the data and saving them, an update exception occurs.

2 A column of data type Timestamp or Rowversion is automatically incremented when a record is updated and therefore detects all concurrent changes to this record.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ 中的更新查询包含 WHERE 子句中的所有列,而不仅仅是主键列 的相关文章

随机推荐

  • jQuery UI 令牌

    我按照本教程使用 jQuery UI 生成 Facebook 令牌 例如 http net tutsplus com tutorials javascript ajax how to use the jquery ui autocomple
  • 自动装配到列表中时的 Bean 顺序

    我定义了一个接口IWorker以及它的一些实现WorkerA and WorkerB 都注释为 Component 然后我通过以下方式将它们自动连接到我的应用程序中 Autowired private List
  • 如何从 NSData 字符串数据(不是 UIImage)创建 CGImageRef

    如何在没有 UIImage 的情况下创建新的 CGImageRef 我不能使用image CGImage 我从服务器进程接收到一个以 std string 形式存在的 Base64 编码图像 下面代码的第一部分模拟接收编码字符串 UIIma
  • 股票预测:GRU 模型预测相同的给定值而不是未来的股票价格

    i was just testing this model from kaggle post this model suppose to predict 1 day ahead from given set of last stocks A
  • 为什么colspan影响html表格边框

    所以我偶然发现了一些对我来说似乎很奇怪的东西 例如 以下代码 table tr td align center style border 3px solid black Title td tr tr td style border 2px
  • 如何检查jframe是否打开?

    我下面的代码创建一个新数组并将其发送到聊天 jFrame String info1 new String 3 username userid userid2 are variables info1 0 username4 info1 1 u
  • 如何更改JsRender模板标签?

    我用树枝 它使用这些标签 name 我想将 JsRender 包含在我的项目中 但 JsRender 也使用相同的标签 name 所以存在冲突并且没有任何作用 如何使用自定义标签更改默认的 JsRender 标签 类似于 Ruby UPD
  • PyQT 布局之间的导航

    下面是我的应用程序代码 它允许您在窗口之间切换 该菜单有两个编程选项 例如 详细报告 和 所有公司 现在加载布局后 我不知道如何将按钮放在这两个视图中 以允许您将视图从 详细报告 更改为 全部 公司 反之亦然 你能帮助我吗 class Ap
  • Stackdriver 日志记录中不会创建任何日志

    在我的谷歌应用程序脚本中 我有 Logger log test 我什至尝试过 console log test 但即使我将项目 id 设置为 Google Cloud 项目 id 也不会打印到 stackdriver 日志中 屏幕显示 为了
  • .NET 中将 int 转换为位数组

    如何将 int 转换为位数组 如果我例如有一个值为 3 的 int 我想要一个长度为 8 的数组 如下所示 0 0 0 0 0 0 1 1 这些数字中的每一个都位于数组中大小为 8 的单独槽中 Use the BitArray class
  • MySQL 多数据库设置

    我已经寻找了这个问题的答案 我似乎能找到的只是一些问题 询问是使用多个数据库还是在单个数据库中使用多个表更好 但这不是我的问题 问题 1 我想在当前数据库旁边设置一个新数据库 但不知道如何操作 我想授予用户对 DB2 的完全管理员访问权限
  • VBA:检测用户窗体的任何文本框中的更改

    有一个用户表单有很多文本框 我需要检测每个文本框的更改 因此 我为表单中的每个文本框编写了一个子例程 结果是一大段代码 由于每个文本框的代码都是相同的 我想优化它 那么是否可以只编写一个子例程来检测表单的任何文本框中的更改 实现这一目标的唯
  • 在32位系统上安装64位glib2进行交叉编译

    我正在尝试在 32 位 ubuntu 系统上交叉编译 64 位可执行文件 这一直有效 直到链接为止 由于缺少 64 位 glib2 libglib 2 0 a 它失败了 如果我在 64 位系统上执行此操作 我会使用getlibs将 32 位
  • OpenJPA 合并/持久非常慢

    我在 WebSphere Application Server 8 上使用 OpenJPA 2 2 0 和 MySQL 5 0 DB 我有一个要合并到数据库中的对象列表 就像是 for Object ob list Long start C
  • Redis:插入元素在开头还是结尾时,ZADD 是否比 O(logN) 更好?

    雷迪斯文档对于 ZADD 来说 操作是 O logN 然而 有谁知道 ZADD 是否比 O logN 当插入的元素位于排序顺序的开头或结尾时 例如 对于某些实现 这可能是 O 1 具体来说 redistutorial指出 排序集是通过双端口
  • 如何获取 Win32 中可用串行端口的列表?

    我有一些遗留代码 通过调用提供 PC 上可用 COM 端口的列表EnumPorts 函数 然后过滤以 COM 开头的端口名称 出于测试目的 如果我可以将此代码与类似的东西一起使用 那将非常有用com0com 它提供了成对的虚拟 COM 端口
  • Typescript 模块和 systemjs。从内联脚本实例化类

    我正在使用系统模块选项将 typescript 模块转换为 javascript 我正在浏览器中执行此操作 当初始化由 typescript 生成的模块类的代码也使用 systemjs system import 加载时 我可以使用此模块
  • td 中的多行

    Stores td 包含多行表 一个商店可以有多个 商店 行 参见示例 https jsfiddle net ak3wtkak 1 商店宽度和数量 th 第二个表中的多行列应相同 如何解决这个问题或者什么是替代方法 table border
  • 处理带有 Promise 的对象数组

    我正在尝试制作一个 Node Express 应用程序 在其中从不同的 url 获取数据 调用 node fetch 来提取某些页面的正文以及有关某些 url 端点的其他信息 然后我想渲染一个 html 表格来通过信息数组显示这些数据 我在
  • LINQ 中的更新查询包含 WHERE 子句中的所有列,而不仅仅是主键列

    我正在使用 Linq 更新表中的单个列 请使用下面的虚构表格 MyTable PKID ColumnToUpdate SomeRandomColumn var row from x in DataContext MyTable where