【发布时间】:2020-06-25 22:27:27
【问题描述】:
使用 EF Core 控制台应用程序,我需要让管理员用户能够选择一个复选框,然后在按下按钮时,基本上运行这个伪代码语句
update EF Table set active = 'Yes' where userID = userID of checkbox
使用 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'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。'
编辑 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 指令或程序集引用?)
【问题讨论】:
-
SaveChanges保存所有修改。它不应该在循环中调用。至于第二个错误,ForEach是一个List<T>方法。您需要先将数据加载到列表中,尽管您可以使用foreach并修改每个对象而不将其放入列表中