我正在使用 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.
这是默认行为:
- 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).
- 如果一个表确实有一个
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(使用前将#替换为@)