Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
C# 我如何做一个简单的;更新[table],其中[anyfield]=[anyvalue]_C#_Sql_.net_Entity Framework - Fatal编程技术网

C# 我如何做一个简单的;更新[table],其中[anyfield]=[anyvalue]

C# 我如何做一个简单的;更新[table],其中[anyfield]=[anyvalue],c#,sql,.net,entity-framework,C#,Sql,.net,Entity Framework,我知道如何用SQL编写代码,但在EF中,我被难住了: SQL查询: UPDATE Queue SET Status = 'Locked' WHERE ID = 1 AND Status = 'New' 我试过了,但知道EF的DbContext中的错误是这样的 var queueEntities = new QueueEntities(); var queueItem = queueEntities.SingleOrDefault<Queue>(q => q.id == 1

我知道如何用SQL编写代码,但在EF中,我被难住了:

SQL查询:

UPDATE Queue
SET Status = 'Locked'
WHERE ID = 1 AND Status = 'New'
我试过了,但知道EF的
DbContext
中的错误是这样的

var queueEntities = new QueueEntities();

var queueItem = queueEntities.SingleOrDefault<Queue>(q => q.id == 1 && q.Status = "New");

queueItem.Status = "Locked";

queueEntities.Entry<Queue>(queueItem).State = System.Data.Entity.EntityState.Modified;

queueEntities.SaveChanges();
var queueEntities=new queueEntities();
var queueItem=queueEntities.SingleOrDefault(q=>q.id==1&&q.Status=“New”);
queueItem.Status=“已锁定”;
queueEntities.Entry(queueItem).State=System.Data.Entity.EntityState.Modified;
queueEntities.SaveChanges();
出于明显的原因,这些与以下不同:

SQL方法在更新记录时锁定该记录

DbContext
方法获取它,然后更新它。在并发状态下,这允许线程A获取该项,在调用更新之前,线程B将已经获取该项,导致两个项都处理
QueueItem


如果你需要更具体的东西,请告诉我

我找到了答案,这就是我们所说的批量更新。为了能够在中有一个完全可自定义的where子句来安装Nuget软件包:PM>安装软件包EntityFramework.Extended。参考网站为:


这有点让人心烦,不是吗?实体框架无法定义多个/自定义的where子句?

与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。看见“。你为什么指线程?您是否正在尝试更新线程上的每个实体?为什么不更新所有实体,然后调用SaveChanges一次呢?一个线程,一个事务。不,我只需要一个线程来更新记录,这样,如果两个线程同时命中记录,SQL update语句会锁定记录并将其设置为已处理,这样当下一个线程进来时(它们同时启动),它会看到它已经被处理,所以不会处理它。在我的例子中,是几十年。我刚读过,没有立即看到任何保证,除非您使用,例如
WITH(TABLOCK)
。我想我终于理解了这个问题。您只是询问如何让EF在UPDATE语句中发出“AND x=y”子句。对