【发布时间】:2019-03-10 18:59:11
【问题描述】:
对于我的 API,我将 Entity Framework Core 与代码优先迁移一起使用。我创建了一些运行良好的关系。现在,我添加了另一个关系(一对多),突然间我被这个错误打了耳光:
Cannot insert explicit value for identity column in table 'Companies' when IDENTITY_INSERT is set to OFF."
当然,我一定是做错了什么,但我就是想不通什么。我遇到了更多这样的问题,答案是“将 IDENTITY_INSERT 设置为 ON”,但这对我不起作用,因为 EF 正在处理所有事情。
我的公司类可以属于一个组:
public class Company
{
// Primary key
public int Id { get; set; }
// The optional Id of a Group
public int? GroupID { get; set; }
...
}
还有 Group 类:
public class Group
{
// Primary key
public int Id { get; set; }
// Name of the Group
public string Name { get; set; }
// List of Companies in this group
public IEnumerable<Company> Companies { get; set; }
}
用于处理 POST 的代码:
// POST api/groups
[HttpPost]
public async Task<IActionResult> Post([FromBody] Group group)
{
try
{
if (ModelState.IsValid)
{
_context.Groups.Add(group);
await _context.SaveChangesAsync();
return CreatedAtRoute("GetGroup", new { id = group.Id }, group);
}
return BadRequest(ModelState);
}
catch (Exception e)
{
return BadRequest($"Unable to create: {e.Message}");
}
}
在我的数据库中,所有列、索引和键都按预期创建,就像我在 API 中建立的所有其他一对多关系一样。但这个具体案例似乎最终以痛苦告终......
我要添加到数据库的类:
【问题讨论】:
-
你能贴出代码吗,哪一部分出现异常?
-
我已经更新了问题
-
您需要确保实体
Company的 EF 映射和表Companies的 DB Schema 对齐。如果您想使用 IDENTITY 进行插入,请确保表模式设置为IDENTITY_INSERT并且 已为 Identity Insert 配置了映射(这最后一部分可能是您的问题)。如果您不想使用它,请确保您在属性中传递了一个明确的值。 -
错误非常简单。在尝试首先创建组时,您正在为您的组传递一个 id。 id 是一个自动递增的主键,所以 id 来自数据库,而不是你。不要设置明确的 id,你很好。
-
@ChrisPratt 听起来很简单,但问题是我没有设置显式 id 并且 EF 处理一切......
标签: sql-server asp.net-core entity-framework-core