【发布时间】:2021-03-20 15:31:59
【问题描述】:
我正在使用 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)
这是在执行更新,但前提是所有列都与 Entity 期望的值匹配,而不是单独引用主键列。
如果一个数据库列被另一个进程改变了,这在这个特定的项目中是非常可行的;例如。在获取您想要操作的行、计算您想要将值设置为的更改以及作为一批行发出更新命令之间存在一个窗口。在这种情况下,查询将导致异常,导致部分更新,除非我捕获、重新加载数据并重新发送单个查询。它还有一个缺点,即行信息可能非常大(例如,包含 HTML 标记),并且整个信息都会传递给 SQL,并且在处理较大的批次时会降低系统速度。
有没有办法让 Linq / Entity 仅根据 Where 子句中的 PK 列发出更新命令?
【问题讨论】:
-
检查 DBML。您可能有一个 TimeStamp 列或一个带有更新检查的列。
-
是的,这已经成功了。默认情况下,所有列的更新检查标志都设置为“始终”。更改整个数据库有点任务,但至少我可以针对少数问题表进行更改。谢谢,如果您想发布作为答案,我会接受。
标签: linq linq-to-sql optimistic-concurrency