SqlException错误求助:IDENTITY_INSERT为OFF时无法插入Ogretmenler标识列
错误解决:无法向标识列插入显式值
错误原因
你的Ogretmenler表主键(标识列,通常为Id)设置了自动增长(SQL Server IDENTITY属性),但插入数据时你手动给该字段赋值了,默认状态下SQL Server禁止这种操作,除非开启IDENTITY_INSERT。
解决方法
方法一:规范配置实体与视图(常规场景推荐)
这是最常见的解决方案,确保标识列由数据库自动生成,且插入时不手动传入值:
检查实体类配置
确认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(); }
- 数据注解方式:
检查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
相关产品推荐
相关产品推荐

