You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中EF Core写入Identity列报错,求阻止写入Id列方法

解决EF Core插入Regions表时Identity列写入错误

错误信息:

Cannot insert explicit value for identity column in table 'Regions' when IDENTITY_INSERT is set to OFF.

问题核心是当前EF Core配置错误地将自动递增的Id列标记为需要手动赋值,导致EF尝试向标识列写入值。以下是具体修复步骤:

1. 修正模型类的Id属性配置

将Id的DatabaseGenerated特性改为Identity,明确告知EF该值由数据库自动生成:

public partial class RegionsModel
{
    [DisplayName("No :")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 改为Identity
    public int Id { get; set; }
    [Key]
    public Guid RegionId { get; set; }
    [DisplayName("Region Name :")]
    public string RegionName { get; set; } = null!;
}

2. 调整DbContext中的实体配置

将Id列的生成策略改为ValueGeneratedOnAdd,并指定使用数据库标识列:

modelBuilder.Entity<RegionsModel>(entity =>
{
    entity.Property(e => e.Id)
          .ValueGeneratedOnAdd()
          .UseIdentityColumn(); // SQL Server专属配置,其他数据库可适配对应方法

    entity.Property(e => e.RegionId).HasDefaultValueSql("(newid())");

    entity.Property(e => e.RegionName).HasMaxLength(50);
});

3. 移除Create方法中Id的绑定

在CreateRegion方法的Bind属性中删除Id,避免从请求中绑定无效值:

public async Task<IActionResult> CreateRegion([Bind("RegionId,RegionName")] RegionsModel regionsModel)
{
    if (ModelState.IsValid)
    {
        _context.Add(regionsModel);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(RegionsIndex));
    }
    return View(regionsModel);
}

额外注意事项

如果之前已生成数据库迁移并创建了表,需要生成新的迁移来更新Id列的属性,确保数据库中Id列是IDENTITY(1,1)类型,执行迁移后即可正常插入数据。

内容的提问来源于stack exchange,提问作者AlexJames

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:01:07