我收到以下错误:
Cannot insert explicit value for identity column in table 'Designator' when IDENTITY_INSERT is set to OFF
我有一个EQUIPMENT实体和一个DESIGNATOR实体。我正在创建一个新的设备实体,并将设备的DESIGNATOR属性设置为我数据库中的现有指示符。
问题是当我尝试将新设备插入数据库时,它认为我也在尝试插入新的DESIGNATOR。我的客户端页面有一个可选择的DESIGNATOR实体列表,所以当然这些实体都有来自数据库的主键,因为它们已存在于那里。但是当我在客户端设置我的EQUIPMENT实体的DESIGNATOR导航属性并将其发布到服务器时,它认为DESIGNATOR是新的,因此不能分配主键(因此错误)。
我很确定在使用之前的实体框架版本时没有发生这种情况。
[HttpPost]
public IActionResult PostEquipment([FromBody] Equipment equipment)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (EquipmentExists(equipment.EquipmentId))
{
_context.Entry(equipment).State = EntityState.Modified;
}
else//updating
{
_context.Equipments.Add(equipment);
}
try
{
_context.SaveChanges();
}
catch (DbUpdateException)
{
if (EquipmentExists(equipment.EquipmentId))
{
return new StatusCodeResult(StatusCodes.Status409Conflict);
}
else
{
throw;
}
}
return Ok(equipment);
}
有什么建议吗?感谢。
答案 0 :(得分:1)
您的设备对象通过http发送,然后与指定符对象一起进行反序列化。然后将此完整对象树添加到EF上下文。 EF并不知道指定符值已经保存在数据库中,因此它会尝试将其作为新行插入。它是一种标准行为。您需要手动将指定者条目的状态设置为“已修改”,或者从db重新加载指示符。
答案 1 :(得分:0)
我明白了。谢谢你指点我正确的方向。正如威尔所说,关键是在客户端清除导航属性,但是明确设置FK id。我没有为导航属性设置明确的FK,所以我创建了这些,然后从中获取了DESIGNATOR ID用户选择了什么并在新的EQUIPMENT实体上进行设置。
感谢大家的指导。我真的很感激。