C# 使用实体框架链接表运行Update语句

C# 使用实体框架链接表运行Update语句,c#,entity-framework-core,C#,Entity Framework Core,使用EF核心控制台应用程序,我需要让管理员用户能够选择一个复选框,按下按钮,基本上运行这个伪代码状态 update EF Table set active='Yes',其中userID=复选框的userID 我可以用EF运行Select,但如何进行更新 编辑 我现在有这个语法 foreach ((int Id, DateTime? submissionDate, string status) tuple in apiData) { if (ctx.Test.Any(x => x.O

使用EF核心控制台应用程序,我需要让管理员用户能够选择一个复选框,按下按钮,基本上运行这个伪代码状态

update EF Table set active='Yes',其中userID=复选框的userID

我可以用EF运行
Select
,但如何进行更新

编辑
我现在有这个语法

foreach ((int Id, DateTime? submissionDate, string status) tuple in apiData)
{
    if (ctx.Test.Any(x => x.OrderId == tuple.Id))
    {
        Test ts = new Test();
        ts.Status = tuple.status;
        ctx.Test.Add(ts);
        ctx.SaveChanges();
    }
    else
    {
        Test ts = new Test();
        ts.OrderId = tuple.Id;
        ts.PdfDownloaded = tuple.submissionDate;
        ts.Status = tuple.status;
        ctx.Test.Add(ts);
        ctx.SaveChanges();
    }
}
但是当我运行代码时,我在更新(if)时得到了这个错误

System.InvalidOperationException:'无法跟踪实体类型'Test'的实例,因为已在跟踪另一个具有{'OrderId'}相同键值的实例。附着现有实体时,请确保仅附着一个具有给定键值的实体实例。考虑使用“dBraveTopStudioBuffel.EnabasEngsivdEdTracle”来查看冲突的键值。

编辑2
我也尝试过这种方法

var records = ctx.Test.Where(x => x.OrderId == tuple.Id);
records.ForEach(x => x.Status = tuple.status);
ctx.SaveChanges();
但是我在
foreach

“IQueryable”不包含“ForEach”的定义,并且找不到接受“IQueryable”类型的第一个参数的可访问扩展方法“ForEach”(是否缺少using指令或程序集引用?)


您应该首先获取要更新的记录

var records = context.EFTable.Where(x => x.userID == UserId).ToList();
然后,在所有这些对象上,应将“活动”设置为“是”

records.ForEach(x => x.active = "yes");
最后,保存所有更改

context.saveChanges();

您应该首先获取要更新的记录

var records = context.EFTable.Where(x => x.userID == UserId).ToList();
然后,在所有这些对象上,应将“活动”设置为“是”

records.ForEach(x => x.active = "yes");
最后,保存所有更改

context.saveChanges();
也 将保存的更改也放在循环之外

将SaveChanges置于循环之外

where是如何发挥作用的,所以我只更新一个?您不需要使用“where”。框架将自动生成。(您无法控制,因为实际上将生成SQL语句。这就是实体的结构比普通查询慢的原因)我仍然不明白。我想使用
if-else
语句,检查
userID
是否已经存在于表中,然后需要更新,如果userID不存在,则需要插入。我已经记下了insert语法,但是我不能把注意力集中在
更新上。请发布完整的实体类测试。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-
where
是如何起作用的,所以我只更新一个?您不需要使用“where”。框架将自动生成。(您无法控制,因为实际上将生成SQL语句。这就是实体的结构比普通查询慢的原因)我仍然不明白。我想使用
if-else
语句,检查
userID
是否已经存在于表中,然后需要更新,如果userID不存在,则需要插入。我已经记下了insert语法,但是我不能把注意力集中在
更新上。请发布完整的实体类测试。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-在我的编辑中,我不是在抓取我要更新的记录吗?不,在你的编辑中,你不是在抓取记录,就像我在回答的第一行代码中所做的那样。您可以更改
Test ts=new Test()
to
testts=ctx.FirstOrDefault(x=>x.OrderId==tuple.Id)“DataBankContext”没有包含“FirstOrDefault”的定义,并且找不到接受“DataBankContext”类型的第一个参数的可访问扩展方法“FirstOrDefault”(是否缺少using指令或程序集引用?)
来修复该错误,您应该添加
System.Linq
名称空间。关于这一点的更多信息,请看一下这一部分。我需要在我的编辑中执行
ctx.Test.FirstOrDefault()
,我不是在抓取我要更新的记录吗?不,在你的编辑中,你不是在抓取记录,就像我在回答的第一行代码中所做的那样。您可以更改
Test ts=new Test()
to
testts=ctx.FirstOrDefault(x=>x.OrderId==tuple.Id)“DataBankContext”没有包含“FirstOrDefault”的定义,并且找不到接受“DataBankContext”类型的第一个参数的可访问扩展方法“FirstOrDefault”(是否缺少using指令或程序集引用?)
来修复该错误,您应该添加
System.Linq
名称空间。关于这一点的更多信息,请看一下这一部分。我需要执行
ctx.Test.FirstOrDefault()
SaveChanges
保存所有修改。不应该在循环中调用它。至于第二个错误,
ForEach
是一个
List
方法。您需要首先将数据加载到列表中,尽管您可以使用
foreach
修改每个对象,而无需将其放入列表
SaveChanges
保存所有修改。不应该在循环中调用它。至于第二个错误,
ForEach
是一个
List
方法。您需要首先将数据加载到列表中,尽管您可以只使用
foreach
修改每个对象而不将其放入列表中