2

我正在使用表的一个时间戳字段来避免将相同的数据返回给执行相同查询的不同用户。

为此,我想仅使用一个查询来更新与我的选择语句匹配的记录。在 postgres 中,我相信可以通过 usingSELECT FOR UPDATE语句来实现,但它可以在DbContext吗?我试图在这里避免多次数据库调用。

现在我使用的 select 语句如下所示:

using (var context = new InventoryContext())
{
    var numbers = await (from a in context.Phones
                       where a.City.Equals(city, StringComparison.OrdinalIgnoreCase) &&
                             a.Type.Equals(type, StringComparison.OrdinalIgnoreCase)
                       select a).ToListAsync();
}

我该如何更改,以便为该查询中的所有条目更新 a.updateTimeStamp?


更新:

这不会解决我的问题(因为仍然可能发生并发),但是要更新上面语句中选择的数据,可以调用:

foreach (var n in numbers)
{
    n.reservationTime = requestTime;
}

context.SaveChanges();
4

1 回答 1

1

你不能用一个 SQL 语句来做到这一点,

您提到的 FOR UPDATE 语句仅锁定行

FOR UPDATE 导致 SELECT 语句检索到的行被锁定,就像更新一样。这可以防止它们被其他事务修改或删除,直到当前事务结束。也就是说,其他尝试对这些行进行 UPDATE、DELETE 或 SELECT FOR UPDATE 的事务将被阻塞,直到当前事务结束

参考

如果您想在 dbContext 上使用普通 SQL,您可以对没有结果的查询执行此操作:

string myUpdateSQL = @"UPDATE Table SET Table.col1 = other_table.col1, 
                       Table.col2 = other_table.col2 FROM Table 
                       INNER JOIN other_table ON Table.id = other_table.id";
using (var context = new InventoryContext())
{
     context.ExecuteStoreCommand(myUpdateSQL);
}

或者对于返回结果的查询:

string sql = "select * from Chapter3.Student where Degree = @Major";
var args = new DbParameter[] { new SqlParameter { ParameterName = "Major", Value = "Masters" } };
var students = context.ExecuteStoreQuery(sql, args);

但 SQL 代码将取决于您的数据库引擎。

于 2013-09-12T14:44:00.127 回答