ASP. NET модели Core MVC - SqlException не может вставить явное значение для столбца идентификаторов - PullRequest
0 голосов
/ 28 января 2020

У меня есть класс Stick, который связан с классом InventoryItem. У меня есть код, который имеет кучу палочек. Я провожу oop через палочки, чтобы создать каждого индивидуума Stick и назначить InventoryItem этой палке.

Однако, когда я пытаюсь сохранить DbContext, я получаю ошибку

SqlException для столбца идентификаторов для таблицы InventoryItems.

Я не понимаю, почему, поскольку InventoryItem уже создан до всего этого. Все, что я делал, это передавал InventoryItem назад и вперед от модели представления и представления.

Пожалуйста, смотрите изображение ниже. Если я удалю выделенную строку кода, то DbContext сможет сохранить, и мой InventoryItem для стиков будет нулевым.

Пожалуйста, ознакомьтесь с приведенными ниже ссылками на коды и сообщите. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Спасибо.

Изображение ошибки

Класс Stick:

public class Stick
{
    public int Id { get; set; }
    public InventoryItem InventoryItem { get; set; }
}

Класс InventoryItem:

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);
}

ViewModel

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>();
    }
}

Ответы [ 4 ]

2 голосов
/ 28 января 2020

Похоже, вы вручную установили значение Id для объекта InventoryItem. Вы не должны делать это, так как оно генерируется автоматически. Просто игнорируйте его при создании этой сущности.

1 голос
/ 28 января 2020

Это простое упущение: если в вашей таблице есть столбец 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);
}

И если Id из Stick также является столбцом идентификаторов, выполните то же самое для этого столбца в классе вашей модели.

Эта аннотация просто говорит EF, что этот столбец является столбцом идентификаторов, который обрабатывается SQL Сервер и этот EF должны игнорировать любое значение, которое вы могли ему присвоить, и не включать этот столбец в оператор INSERT.

Обновление № 2: кажется, что EF Core имеет новое поведение по умолчанию, позволяющее автоматически предполагать, что любой некомпозитный первичный ключ обрабатывается базой данных как «сгенерированное свойство». Спасибо @LazZiya за этот указатель: Сгенерированное значение при добавлении

0 голосов
/ 31 января 2020

Итак, я нашел время, чтобы прочитать некоторые из них и решил переписать свои уроки. Я обнаружил, что действительно полезно было добавить дополнительное свойство, такое как ForeignKeyID, которое помогло мне работать со связанными данными. например:

public class Stick
{
   public int Id { get; set; }
   public InventoryItem InventoryItem { get; set; }
   public int ForeignKeyInventoryItemID { get; set; }
}

Спасибо за документацию.

0 голосов
/ 28 января 2020

Если вы хотите установить значение первичного ключа для модели 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

...