C# 使用实体框架链接表运行Update语句
使用EF核心控制台应用程序,我需要让管理员用户能够选择一个复选框,按下按钮,基本上运行这个伪代码状态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
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()
totestts=ctx.FirstOrDefault(x=>x.OrderId==tuple.Id)代码>“DataBankContext”没有包含“FirstOrDefault”的定义,并且找不到接受“DataBankContext”类型的第一个参数的可访问扩展方法“FirstOrDefault”(是否缺少using指令或程序集引用?)
来修复该错误,您应该添加System.Linq
名称空间。关于这一点的更多信息,请看一下这一部分。我需要在我的编辑中执行ctx.Test.FirstOrDefault()
,我不是在抓取我要更新的记录吗?不,在你的编辑中,你不是在抓取记录,就像我在回答的第一行代码中所做的那样。您可以更改Test ts=new Test()
totestts=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
修改每个对象而不将其放入列表中