问题
我在asp.net核心创建一个web应用程序,ef核心使用Repository模式 . 我试图插入一个实体它工作正常,当我试图检查它是否已经存在于数据库中,或者如果是,而不是在同一个api中更新相同的实体,它给了我这个错误 .
System.InvalidOperationException:'无法跟踪实体类型'Consultation'的实例,因为已经跟踪了具有相同键的此类型的另一个实例 . 添加新实体时,对于大多数密钥类型,如果未设置密钥,则将创建唯一的临时密钥值(即,如果为密钥属性指定了其类型的默认值) . 如果要为新实体显式设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突 . 附加现有实体时,请确保只有一个具有给定键值的实体实例附加到上下文 .
图片
代码
插入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-检索代码中的咨询对象:
var consult = _consultationService.GetConsultationById(consultation.Id);
2-更改检索对象(从咨询复制内容到咨询)您没有 .
3-更新对象
consult
4-保存更改 .
也许在SaveChanges()之前尝试这一行 .
这需要System.Data.Entity.Migrations命名空间 .
您的问题可能已经在这里得到解答:Update Row if it Exists Else Insert Logic with Entity Framework