使用实体框架更新时获取“插入”输出

Dan*_*iel 6 c# t-sql entity-framework entity-framework-6

SQL Server 使用“inserted”关键字提供插入和更新记录的输出。

我有一个代表处理队列的表。我使用以下查询来锁定记录并获取锁定记录的 ID:

UPDATE TOP (1) GlobalTrans
SET LockDateTime = GETUTCDATE()
OUTPUT inserted.ID
WHERE LockDateTime IS NULL
Run Code Online (Sandbox Code Playgroud)

这将输出一个名为 ID 的列,其中包含所有更新的记录 ID(在我的例子中为单个 ID)。如何将其转换为 C# 中的 EF 来执行更新并取回 ID?

nvo*_*igt 2

实体框架无法做到这一点。

您可以通过 ORM 方式来完成此操作,方法是选择所有记录,设置它们的 LockDateTime 并将它们写回。这对于您想要做的事情来说可能不安全,因为默认情况下它不是一笔交易。

您可以跨越自己的事务并使用RepeatableRead作为隔离级别。那应该有效。不过,根据您的数据库在后台执行的操作,这可能有点矫枉过正。

您可以手动编写 SQL 。这违背了实体框架的目的,但就锁定机制而言,它应该和以前一样安全。

您还可以将其放入存储过程中并调用它。它比上面的版本好一点,因为至少有人会编译它并检查表和列名称是否正确。