EFCore:简单属性更新期间的实体关联错误

我想在我的控制器中设置一个 bool 属性并将其保存到数据库中。EF 会引发有关其他甚至未修改的属性的错误。

实体“User”和“RequestDetail”与键值为“System.InvalidOperationException”之间的关联:实体“User”和“RequestDetail”与键值为“{Id: 40}”之间的关联已被切断,但关系是标记为“必需”或隐式必需,因为外键不可为空。如果在切断所需关系时应删除依赖/子实体,则将关系设置为使用级联删除。

如果我用一个附加参数调用我的方法,它必须更改一个 RequestDetail 记录的 RequestSent 属性,这很好用。但是在没有此附加参数的情况下调用该方法必须更改多个 RequestDetail 记录上的此属性。这就是它抛出错误的地方。我不会修改与用户相关的任何内容。如果它必须一次做更多的记录,它会抛出这个错误。即使我使用 FirstOrDefaults() 和立即 SaveChanges() 将 foreach 重写为一段时间,它也会在第二轮引发错误。

我的方法:


var head = await _ctx.RequestHeads.FirstOrDefaultAsync(x=>x.Id == d.Id);

if (!d.DetailId.HasValue) {

            var details = _ctx.RequestDetails.Include(x=>x.BuyerUser)

                            .Where(x=>x.RequestHeadId == head.Id); 

//not working, always throws an error if it has to modify more than one record

            await details.ForEachAsync(detail => {

                detail.RequestSent = true;

            });

        } else {

            var detail = head.Details.FirstOrDefault(x=>x.Id == d.DetailId.Value); //works ok, always

            detail.RequestSent = true;

        }

        await _ctx.SaveChangesAsync();


MYYA
浏览 255回答 1
1回答

摇曳的蔷薇

解决方案是将 RequestDetail<=>User 关系从 WithOne() 更改为 WithMany()。尽管错误消息有些误导,@IvanStoev 的可能解释如下:我猜一对一的代码需要单条记录,所以当第二条具有相同 FK 的记录进来时,他们感到困惑并决定删除该记录
打开App,查看更多内容
随时随地看视频慕课网APP