EF核心相关实体问题

时间:2016-10-24 20:35:44

标签: .net entity-framework entity-framework-core

我收到以下错误:

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);
    }

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:1)

您的设备对象通过http发送,然后与指定符对象一起进行反序列化。然后将此完整对象树添加到EF上下文。 EF并不知道指定符值已经保存在数据库中,因此它会尝试将其作为新行插入。它是一种标准行为。您需要手动将指定者条目的状态设置为“已修改”,或者从db重新加载指示符。

答案 1 :(得分:0)

我明白了。谢谢你指点我正确的方向。正如威尔所说,关键是在客户端清除导航属性,但是明确设置FK id。我没有为导航属性设置明确的FK,所以我创建了这些,然后从中获取了DESIGNATOR ID用户选择了什么并在新的EQUIPMENT实体上进行设置。

感谢大家的指导。我真的很感激。