LINQ中的Update查询包含WHERE子句中的所有列,而不仅仅是主键列
我正在使用Linq更新表中的一列,以下面的虚拟表为例 MyTable(PKID、ColumnToUpdate、SomeRandomColumn) 这会按预期将列更新为,这里没有任何意外。但是,当我检查生成的SQL命令时,它会执行以下操作:LINQ中的Update查询包含WHERE子句中的所有列,而不仅仅是主键列,linq,linq-to-sql,optimistic-concurrency,Linq,Linq To Sql,Optimistic Concurrency,我正在使用Linq更新表中的一列,以下面的虚拟表为例 MyTable(PKID、ColumnToUpdate、SomeRandomColumn) 这会按预期将列更新为,这里没有任何意外。但是,当我检查生成的SQL命令时,它会执行以下操作: UPDATE [dbo].[MyTable ] SET [ColumnToUpdate ] = @p2 WHERE ([PKID] = @p0) AND ([SomeRandomColumn] = @p1) 这是在执行更新,但前提是所有列都匹配实体期望的值
UPDATE [dbo].[MyTable ]
SET [ColumnToUpdate ] = @p2
WHERE ([PKID] = @p0) AND ([SomeRandomColumn] = @p1)
这是在执行更新,但前提是所有列都匹配实体期望的值,而不是单独引用主键列
如果数据库列被另一个进程更改,这在这个特定项目中是非常可行的;在获取要操作的行、计算要将值设置为的更改和作为一批行发出update命令之间有一个窗口。在这种情况下,查询将导致异常,导致部分更新,除非我捕获、重新加载数据并重新发送单个查询。它还有一个缺点,行信息可能非常大(例如,包含HTML标记),整个过程都会传递给SQL,当处理较大的批时,会减慢系统的速度
是否有一种方法可以使Linq/Entity仅基于Where子句中的PK列发出更新命令?我从未在生产项目中使用Linq to SQL,也从未意识到它在默认情况下应用乐观并发1 这是默认行为:
时间戳/Rowversion
列2,则所有列在DBML中将“更新检查”设置为“始终”(主键列和计算列除外,即所有可更新列)时间戳/Rowversion
列,则此列在DBML中将“时间戳”设置为“True”,并且所有列都有“更新检查”=“从不”Timestamp/Rowversion
列,因此更新会检查表中所有可更新列的值
1乐观并发:更新记录时不设置排他锁,但在更新时检查所有或选定列的现有值。如果另一个用户在获取数据和保存数据之间更改了其中一个列值,则会发生更新异常
2更新记录时,数据类型为
时间戳
或行版本
的列会自动递增,因此会检测到此记录的所有并发更改。我从未在生产项目中使用LINQ to SQL,也从未意识到默认情况下它会应用乐观并发1
这是默认行为:
时间戳/Rowversion
列2,则所有列在DBML中将“更新检查”设置为“始终”(主键列和计算列除外,即所有可更新列)时间戳/Rowversion
列,则此列在DBML中将“时间戳”设置为“True”,并且所有列都有“更新检查”=“从不”Timestamp/Rowversion
列,因此更新会检查表中所有可更新列的值
1乐观并发:更新记录时不设置排他锁,但在更新时检查所有或选定列的现有值。如果另一个用户在获取数据和保存数据之间更改了其中一个列值,则会发生更新异常
2当更新记录时,数据类型为
时间戳
或行版本
的列将自动递增,因此会检测到此记录的所有并发更改。检查DBML。您可能有一个TimeStamp列或一个带有更新检查的列。是的,这就完成了。默认情况下,所有列的更新检查标志都设置为“始终”。更改整个数据库有点困难,但至少我可以为几个问题表更改它。谢谢,如果你想作为答案发布,我会接受。请检查DBML。您可能有一个TimeStamp列或一个带有更新检查的列。是的,这就完成了。默认情况下,所有列的更新检查标志都设置为“始终”。更改整个数据库有点困难,但至少我可以为几个问题表更改它。谢谢,如果你想作为答案发布,我会接受的。
UPDATE [dbo].[MyTable ]
SET [ColumnToUpdate ] = @p2
WHERE ([PKID] = @p0) AND ([SomeRandomColumn] = @p1)