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

ASP.NET API插入数据时IDENTITY_INSERT设置为OFF错误求助

解决IDENTITY_INSERT is set to OFF错误

问题根源

你的数据库表Tax实际主键是Id + Rate复合主键,且Id为IDENTITY自动生成列,但EF上下文的实体配置与数据库结构不匹配:

  • 代码中仅将Rate设为主键,遗漏了Id
  • 未明确告知EF:Id是IDENTITY列,插入时无需手动赋值

这导致EF生成的插入SQL试图操作Id列,触发SQL Server的IDENTITY_INSERT限制。

解决方案

1. 修正EF实体配置

更新OnModelCreating方法,确保与数据库结构完全对齐:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置复合主键(Id + Rate),与数据库一致
    modelBuilder.Entity<Tax>().HasKey(k => new { k.Id, k.Rate });
    // 标记Id为IDENTITY自动生成列
    modelBuilder.Entity<Tax>().Property(t => t.Id).UseIdentityColumn();
    
    base.OnModelCreating(modelBuilder);
}

2. 确认插入逻辑

你的示例JSON未包含Id,这符合IDENTITY列的使用规则,无需修改。但要确保在.NET代码中创建Tax对象时,不要手动给Id赋值(保持默认0即可,EF会自动忽略该值,由SQL Server生成)。

特殊场景:需手动插入Id值(不推荐)

如果业务上必须手动指定Id值,需先开启IDENTITY_INSERT,插入后再关闭:

SET IDENTITY_INSERT Tax ON;
-- 执行包含Id值的插入语句
SET IDENTITY_INSERT Tax OFF;

在EF中可通过原生SQL实现,示例:

using (var transaction = context.Database.BeginTransaction())
{
    context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Tax ON;");
    
    var tax = new Tax { Id = 100, Rate = 5.5m, Name = "aCoolName55" };
    context.Tax.Add(tax);
    context.SaveChanges();
    
    context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Tax OFF;");
    transaction.Commit();
}

验证步骤

  1. 重新生成EF迁移(若使用Code First)或确保配置生效
  2. 执行插入操作,确认错误消失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:19