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

SqlException错误求助:IDENTITY_INSERT为OFF时无法插入Ogretmenler标识列

错误解决:无法向标识列插入显式值

错误原因

你的Ogretmenler表主键(标识列,通常为Id)设置了自动增长(SQL Server IDENTITY属性),但插入数据时你手动给该字段赋值了,默认状态下SQL Server禁止这种操作,除非开启IDENTITY_INSERT。

解决方法

方法一:规范配置实体与视图(常规场景推荐)

这是最常见的解决方案,确保标识列由数据库自动生成,且插入时不手动传入值:

  1. 检查实体类配置
    确认Ogretmen实体的主键字段被标记为数据库自动生成:

    • 数据注解方式:
      public class Ogretmen
      {
          [Key]
          [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
          public int Id { get; set; }
          // 其他属性...
      }
      
    • Fluent API方式(若使用此配置):
      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Entity<Ogretmen>()
              .Property(o => o.Id)
              .ValueGeneratedOnAdd();
      }
      
  2. 检查Create视图
    确保视图中没有包含Id字段的输入控件(比如<input asp-for="Id" />或隐藏域),避免提交表单时将Id的值(如0)传到后台。如果有,直接删除相关代码。

方法二:临时开启IDENTITY_INSERT(特殊场景使用)

如果确实需要手动插入标识列的值(如数据迁移),可以临时开启该选项,但不建议用于常规新增操作:

修改你的Post方法:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Ogretmen obj)
{
    if (ModelState.IsValid)
    {
        using (var transaction = _db.Database.BeginTransaction())
        {
            try
            {
                _db.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Ogretmenler ON");
                _db.Ogretmenler.Add(obj);
                _db.SaveChanges();
                _db.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Ogretmenler OFF");
                transaction.Commit();
                return RedirectToAction("Index");
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
        }
    }
    return View(obj);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:20:43