更新实体时,控制器出现错误
在先前的操作完成之前,第二操作在此上下文上开始。不保证任何实例成员都是线程安全的。
码:
public class MyController: Controller
{
private readonly DbContext _db = new DbContext();
方法是
[HttpPatch]
[Route("MyRoute")]
public async Task<ActionResult> UpdateMyCase([Required][FromBody]MyProject body)
{
using(var dbContextTransaction = _db.Database.BeginTransaction())
{
_db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var p = (from a in _db.MyProject
where a.Id == body.Id
select a).FirstOrDefault();
p.Name = "new Name";
p.Score = "new score";
// ....
var m = _db.MyProjectLink.Where(x => x.Id == p.Id);
for(var key in m)
{
if(m.Any(x => x.Id != "something"))
{
var link = new MapProjectLink();
link.MapId = "some id dynamic generated";
link.Id = body.Id;
link.Tool = key.tool;
_db.MapProjectLink.Add(link);
}
}
await _db.SaveChangesAsync();
return OK(p);
}
}
为了解释代码,基本上我有三个表。
_db.MyProject
,__ cc和db.MyMap
。前两个表是多对多的。第三张表将它们链接在一起。我想将更新后的值保存到两个表:_db.MapProjectLink
和_db.MyProject
。顺便说一下,我目前不使用依赖注入。我猜可能是for循环引起了问题。
错误是
保存上下文类型“ MapProjectLink”的更改时,数据库中发生了异常。 System.InvalidOperationException:在上一个操作完成之前,在此上下文上启动了第二个操作。不保证任何实例成员都是线程安全的。
最佳答案
事实证明,我必须将与_db关联的所有内容放入Task.Run
。然后Wait
。这意味着等待任务完成,然后继续下一个流程。
关于c# - 更新实体错误:在上一个操作完成之前,在此上下文上启动了第二个操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58295759/