我在asp.net核心创建一个web应用程序,ef核心使用Repository模式。我正在尝试插入一个实体,当我试图检查它是否已经存在于db中时它工作正常,或者如果是,则在同一个api中更新同一个实体它会给我这个错误。
System.InvalidOperationException:'无法跟踪实体类型'Consultation'的实例,因为已经跟踪了具有相同键的此类型的另一个实例。添加新实体时,对于大多数密钥类型,如果未设置密钥,则将创建唯一的临时密钥值(即,如果为密钥属性指定了其类型的默认值)。如果要为新实体显式设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突。附加现有实体时,请确保只有一个具有给定键值的实体实例附加到上下文。'
[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");
}
答案 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