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(); }
验证步骤
- 重新生成EF迁移(若使用Code First)或确保配置生效
- 执行插入操作,确认错误消失
内容的提问来源于stack exchange,提问作者harili
相关产品推荐
相关产品推荐

