![](/img/trans.png)
[英]SqlException: Cannot insert explicit value for identity column in table 'Categories' when IDENTITY_INSERT is set to OFF ASP.NET Core 2.1
[英]ASP.NET Core MVC models - SqlException cannot insert explicit value for identity column
我有一個與InventoryItem
類有關系的Stick
類。 我有一個有一堆棒的代碼。 我循環遍歷棒以創建每個單獨的Stick
並將InventoryItem
分配給該棒。
但是,當我嘗試保存DbContext
,出現錯誤
表 InventoryItems 的標識列的 SqlException。
我不明白為什么,因為InventoryItem
在所有這些之前已經創建。 我所做的只是從視圖模型和視圖來回傳遞InventoryItem
。
請看下圖。 如果我刪除突出顯示的代碼行,則DbContext
將能夠保存,並且我的InventoryItem
將為 Null。
請參閱下面的更多代碼參考並提出建議。 如果您需要更多信息,請告訴我。 謝謝。
棒類:
public class Stick
{
public int Id { get; set; }
public InventoryItem InventoryItem { get; set; }
}
庫存物品類:
public class InventoryItem
{
public int Id { get; set; }
public string Name { get; set; }
public string PartNumber { get; set; }
public double Length { get; set; }
public double GetLengthInInches => Math.Round(Length / 25.4, 0);
}
視圖模型
public class OptimizationViewModel
{
public InventoryItem InventoryItem { get; set; }
public IList<Cut> TempInstanceCuts { get; set; }
public IList<Stick> TempInstanceSticks { get; set; }
public double[] Percents { get; set; }
public int CutQuantity { get; set; }
public double CutLength { get; set; }
public int stickCount { get; set; }
public OptimizationViewModel()
{
TempInstanceCuts = new List<Cut>();
TempInstanceSticks = new List<Stick>();
}
}
看起來您手動設置了InventoryItem
實體的Id
值。 您不應該這樣做,因為它是自動生成的。 創建此實體時只需忽略它。
這是一個簡單的遺漏:如果您的表中有一個INT IDENTITY
列,則需要在模型類的鍵列上添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
注釋:
public class InventoryItem
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string PartNumber { get; set; }
public double Length { get; set; }
public double GetLengthInInches => Math.Round(Length / 25.4, 0);
}
如果Stick
的Id
也是一個標識列,那么在您的模型類中也對該列執行相同的操作。
該注釋只是告訴 EF,該列是由 SQL Server 處理的標識列,EF 應忽略您可能已分配給它的任何值,並且不將該列包含在INSERT
語句中。
更新 #2: EF Core似乎有一個新的默認行為,可以自動假定任何非復合主鍵都由數據庫作為“生成的屬性”處理。 感謝@LazZiya 提供該指針:Added value on Add
如果要手動設置InventoryItem
模型的主鍵值,則需要使用[DatabaseGenerated(DatabaseGeneratedOption.None)]
屬性。
public class InventoryItem
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
//other properties
}
所以我花時間閱讀了其中的一些並決定重寫我的課程。 我發現真正有用的是我需要添加一個額外的屬性,比如 ForeignKeyID,它確實幫助我處理相關數據。 如:
public class Stick
{
public int Id { get; set; }
public InventoryItem InventoryItem { get; set; }
public int ForeignKeyInventoryItemID { get; set; }
}
感謝您的文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.