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
相关产品推荐
相关产品推荐

