我有一個Regions
帶有自動增量ID
列的表。通過我的 ASP.NET Core 應用程式將資料添加到區域表時,我收到此錯誤:
當 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);
}
uj5u.com熱心網友回復:
你需要改變兩件事:
(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 在“添加時”(在表中插入新行時)向該列添加一個新值。
uj5u.com熱心網友回復:
表它必須是明確的SET IDENTITY_INSERT RegionsModel ON
。ef 模型上顯示的更改不會設定表插入標識。也許有,但我不知道是否有物體框架流利的 api 來設定 IDENTITY_INSERT。
嘗試在新添加的 ef 遷移中執行:migrationBuilder.Sql("SET IDENTITY_INSERT RegionsModel ON")
。
或者在 sql 中,如果使用 DB first 方法,只需手動運行 query SET IDENTITY_INSERT RegionsModel ON
。
不知道您的流程,但我認為該方法不正確,如果表必須在 IDENTITY_INSERT OFF 的情況下退出,那么在插入之前可能存在某種 id 的保留,而不是它是有道理的。
就個人而言,我會采用經典方式,在 db insert 處關閉/開啟
dataContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT RegionsModel ON");
dataContext.RegionsModel.Add(new RegionsModel {Id = 1234});
dataContext.SaveChanges();
dataContext.Database.ExecuteSqlCommand("SET IDENTITY_INSERT RegionsModel OFF");
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/525340.html
上一篇:如何處理變數中的多個物件