簡體   English   中英

ASP.NET Core MVC 模型 - SqlException 無法為標識列插入顯式值

[英]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);
}

如果StickId也是一個標識列,那么在您的模型類中也對該列執行相同的操作。

該注釋只是告訴 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 
}

請參閱https://docs.microsoft.com/en-us/ef/core/modeling/generated-properties?tabs=data-annotations#no-value-generation-1

所以我花時間閱讀了其中的一些並決定重寫我的課程。 我發現真正有用的是我需要添加一個額外的屬性,比如 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM