尝试更新

时间:2017-08-17 04:31:06

标签: asp.net-core asp.net-web-api2 repository-pattern entity-framework-core

问题

我在asp.net核心创建一个web应用程序,ef核心使用Repository模式。我正在尝试插入一个实体,当我试图检查它是否已经存在于db中时它工作正常,或者如果是,则在同一个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 个答案:

答案 0 :(得分:1)

更新过程

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

unset n for file in *; do [[ $file =~ ^[0-9]{10}$ ]] && mv -v "$file" dest/ && (( ++n >= 100 )) && break done

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

3-更新对象var consult = _consultationService.GetConsultationById(consultation.Id);

4-保存更改。

答案 1 :(得分:0)

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

_context.AddOrUpdate(entity);

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

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