我有一个名为Regions
的表,其中有一个自动递增的ID
列。当通过我的ASP。NET核心应用程序,我得到这个错误:
当identity_insert设置为OFF时,无法为表"Regions"中的标识列插入显式值。
我知道为什么会发生这种情况,只是不知道如何阻止EF Core将值写入此Id
列。我尝试了一些方法来缓解这种情况,但都无济于事。
这是我的模型,dbContext
和CreateRegions
方法。这个表上的主键是RegionId
。
型号类别:
public partial class RegionsModel
{
[DisplayName("No :")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Key]
public Guid RegionId { get; set; }
[DisplayName("Region Name :")]
public string RegionName { get; set; } = null!;
}
DbContext
:
modelBuilder.Entity<RegionsModel>(entity =>
{
entity.Property(e => e.Id).ValueGeneratedNever();
entity.Property(e => e.RegionId).HasDefaultValueSql("(newid())");
entity.Property(e => e.RegionName).HasMaxLength(50);
});
创建区域方法:
public async Task<IActionResult> CreateRegion([Bind("Id,RegionId,RegionName")] RegionsModel regionsModel)
{
if (ModelState.IsValid)
{
_context.Add(regionsModel);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(RegionsIndex));
}
return View(regionsModel);
}
您需要更改两件事:
(1(模型类上的数据注释需要是[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
:
public partial class RegionsModel
{
[DisplayName("No :")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Key]
public Guid RegionId { get; set; }
[DisplayName("Region Name :")]
public string RegionName { get; set; } = null!;
}
(2(您的OnModelCreating
需要将列Id
定义为在Add
:上设置
modelBuilder.Entity<RegionsModel>(entity =>
{
// set this to "ValueGeneratedOnAdd"
entity.Property(e => e.Id).ValueGeneratedOnAdd();
entity.Property(e => e.RegionId).HasDefaultValueSql("(newid())");
entity.Property(e => e.RegionName).HasMaxLength(50);
});
它将Id
定义为数据库表中的IDENTITY
列,并设置EF Core以允许SQL Server添加一个新值";加上";(在表中插入新行时(添加到该列。