首页 文章

尝试更新时,EF核心中的System.InvalidOperationException

提问于
浏览
0

问题

我在asp.net核心创建一个web应用程序,ef核心使用Repository模式 . 我试图插入一个实体它工作正常,当我试图检查它是否已经存在于数据库中,或者如果是,而不是在同一个api中更新相同的实体,它给了我这个错误 .

System.InvalidOperationException:'无法跟踪实体类型'Consultation'的实例,因为已经跟踪了具有相同键的此类型的另一个实例 . 添加新实体时,对于大多数密钥类型,如果未设置密钥,则将创建唯一的临时密钥值(即,如果为密钥属性指定了其类型的默认值) . 如果要为新实体显式设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突 . 附加现有实体时,请确保只有一个具有给定键值的实体实例附加到上下文 .

图片

enter image description here

代码

插入api

[HttpPost]
public ApiResponse InsertConsultation([FromBody] Consultation consultation)
{
    if (!ModelState.IsValid)
    {
        return new ApiResponse(StatusCodes.Status400BadRequest, error: "error");
    }

    var consult = _consultationService.GetConsultationById(consultation.Id);

    if (consult !=null)
    {
        _consultationService.UpdateConsultation(consultation);
        return new ApiResponse(StatusCodes.Status200OK, success: "isSuccess");
    }

    _consultationService.InsertConsultation(consultation);
    return new ApiResponse(StatusCodes.Status201Created, success: "isSuccess");
}

2 回答

  • 1

    更新过程是

    1-检索代码中的咨询对象:

    var consult = _consultationService.GetConsultationById(consultation.Id);

    2-更改检索对象(从咨询复制内容到咨询)您没有 .

    3-更新对象 consult

    4-保存更改 .

  • 0

    也许在SaveChanges()之前尝试这一行 .

    _context.AddOrUpdate(entity);
    

    这需要System.Data.Entity.Migrations命名空间 .

    您的问题可能已经在这里得到解答:Update Row if it Exists Else Insert Logic with Entity Framework

相关问题