You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行删除操作提示实体类型实例无法被跟踪 相同ID已被跟踪怎么解决

报错原因及修复方案

核心原因

该错误为EF Core上下文的实例跟踪冲突导致:创建对象时EF上下文已经跟踪了对应实体的实例,若删除操作的内部逻辑中又附加了一个同主键的实体实例、或是重复查询了同ID的实体,就会触发「同一上下文内不能同时跟踪多个相同主键实体」的规则报错。

修复步骤

按以下顺序排查修改即可:

  • 首先统一测试方法的异步调用写法,不要混合await和.Result,避免异步上下文紊乱引发额外问题:
public async Task CanDeleteSignal()
{
     var s = new SignalsDTO()
     {
         Name = "Signal",
         TagType = "String",
         Description = "Foo"
     };

     int id = await _handler.Create(s);
     var delete = await _handler.Delete(id);
     // 将同步阻塞的Result替换为await调用
     var signalDelete = await _handler.GetSignalsById(id);
     Assert.IsTrue(delete);
     Assert.IsNull(signalDelete);
}
  • 调整Delete方法的内部实现,优先复用已跟踪的实体,不要直接新建同主键实体附加删除:
public async Task<bool> Delete(int id)
{
    // 先查询已存在的实体,自动复用上下文的跟踪实例
    var entity = await _context.Signals.FindAsync(id);
    if (entity == null) return false;
    _context.Signals.Remove(entity);
    await _context.SaveChangesAsync();
    return true;
}
  • 如果你的测试环境中EF上下文是单例复用的,需要确保每次测试结束后释放上下文,或是每次测试初始化时新建独立的上下文实例,避免不同测试的实体跟踪记录互相干扰。

内容的提问来源于stack exchange,提问作者Weenhallo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:15:01