是否可以在DBContext上进行SELECT FOR UPDATE?

时间:2013-09-12 14:26:40

标签: c# sql entity-framework

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

为了实现这一点,我想只使用一个查询来更新与我的select语句匹配的记录。在postgres中我相信可以使用SELECT 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();

1 个答案:

答案 0 :(得分:0)

您不能使用一个SQL语句

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

  

FOR UPDATE会导致SELECT语句检索到的行   锁定好像是为了更新。这可以防止它们被修改或   在当前交易结束之前被其他交易删除。那   是,尝试UPDATE,DELETE或SELECT FOR的其他事务   这些行的更新将被阻塞,直到当前事务为止   端

reference

如果要在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代码将依赖于您的数据库引擎。