Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ中的Update查询包含WHERE子句中的所有列,而不仅仅是主键列_Linq_Linq To Sql_Optimistic Concurrency - Fatal编程技术网

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

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) 这是在执行更新,但前提是所有列都匹配实体期望的值

我正在使用Linq更新表中的一列,以下面的虚拟表为例

MyTable(PKID、ColumnToUpdate、SomeRandomColumn)

这会按预期将列更新为,这里没有任何意外。但是,当我检查生成的SQL命令时,它会执行以下操作:

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”,并且所有列都有“更新检查”=“从不”
  • “更新检查”或“时间戳”将列标记为并发令牌。这就是为什么在update语句中,您会在(并非如此)“random”列上看到这些附加谓词。显然,模型中的表没有
    Timestamp/Rowversion
    列,因此更新会检查表中所有可更新列的值


    1乐观并发:更新记录时不设置排他锁,但在更新时检查所有或选定列的现有值。如果另一个用户在获取数据和保存数据之间更改了其中一个列值,则会发生更新异常


    2更新记录时,数据类型为
    时间戳
    行版本
    的列会自动递增,因此会检测到此记录的所有并发更改。

    我从未在生产项目中使用LINQ to SQL,也从未意识到默认情况下它会应用乐观并发1

    这是默认行为:

  • 如果表没有
    时间戳/Rowversion
    列2,则所有列在DBML中将“更新检查”设置为“始终”(主键列和计算列除外,即所有可更新列)
  • 如果表中确实有
    时间戳/Rowversion
    列,则此列在DBML中将“时间戳”设置为“True”,并且所有列都有“更新检查”=“从不”
  • “更新检查”或“时间戳”将列标记为并发令牌。这就是为什么在update语句中,您会在(并非如此)“random”列上看到这些附加谓词。显然,模型中的表没有
    Timestamp/Rowversion
    列,因此更新会检查表中所有可更新列的值


    1乐观并发:更新记录时不设置排他锁,但在更新时检查所有或选定列的现有值。如果另一个用户在获取数据和保存数据之间更改了其中一个列值,则会发生更新异常


    2当更新记录时,数据类型为
    时间戳
    行版本
    的列将自动递增,因此会检测到此记录的所有并发更改。

    检查DBML。您可能有一个TimeStamp列或一个带有更新检查的列。是的,这就完成了。默认情况下,所有列的更新检查标志都设置为“始终”。更改整个数据库有点困难,但至少我可以为几个问题表更改它。谢谢,如果你想作为答案发布,我会接受。请检查DBML。您可能有一个TimeStamp列或一个带有更新检查的列。是的,这就完成了。默认情况下,所有列的更新检查标志都设置为“始终”。更改整个数据库有点困难,但至少我可以为几个问题表更改它。谢谢,如果你想作为答案发布,我会接受的。
    UPDATE [dbo].[MyTable ]
    SET [ColumnToUpdate ] = @p2
    WHERE ([PKID] = @p0) AND ([SomeRandomColumn] = @p1)