Идентификация отношений и вставка дочерних объектов приводит к "Невозможно вставить явное значение для столбца идентичности в таблице"

Я пытаюсь заставить идентифицирующие отношения работать в Entity Framework, чтобы я мог удалить элементы из их коллекции, используя Удалить.

Я создал тест как:

public class OrderLine{   
    [Key, Column(Order = 0)]
    public int OrderLineId { get; set; }

    [Key, ForeignKey("Order"), Column(Order = 1)]
    public int OrderId{ get; set; }

    public virtual Order Order{ get; set; }

    [ForeignKey("Product")]
    public int ProductId { get; set; }

    public virtual Product Product { get; set; }

    public int Number { get; set; }}

Когда я пытаюсь добавить OrderLine, как:

        var order=_orderRepository.Find(1);
        var NewOrderLine= new OrderLine()
                                            {
                                                Number = 1,ProductId= 2
                                            };
        order.OrderLines.Add(NewOrderLine);
        _orderRepository.InsertOrUpdate(order);
        _orderRepository.Save();

Я получаю ошибку

Невозможно вставить явное значение для столбца идентификаторов в таблице "OrderLines", если для параметра IDENTITY_INSERT установлено значение OFF.

Когда я смотрю на таблицу, SQL имеет первичный ключ по OrderId и OrderLineId. Также только OrderLineId устанавливается в качестве идентификатора. Поэтому он должен пытаться вставить значение, но единственное значение, которое он пытается вставить, это 0.

Любые идеи я могу сделать вставку в таблицу, используя:

INSERT INTO [OrderLines]
           ([ProductId ]
           ,[Number]
           ,[OrderId])
     VALUES
           (2
           ,1
           ,1)

1 ответ

Решение

Я считаю, что исключение означает, что один из составных столбцов первичного ключа в таблице OrderLines это автоматически сгенерированный идентификатор в базе данных (я думаю, столбец OrderLineId) но EF отправляет значение (0 потому что вы не указываете свойство при создании нового OrderLine) для этого столбца в операторе INSERT для базы данных, поскольку свойство не помечено как удостоверение в модели EF. По умолчанию (= IDENTITY_INSERT является OFF) SQL Server не позволяет явно вставлять значение в столбец идентификаторов.

Действительно, в вашем отображении ключевые столбцы не являются идентичностями, потому что по умолчанию в составном ключе никакое свойство не является идентичностью.

Я думаю, что решение состоит в том, чтобы либо отключить спецификацию идентификации в базе данных, либо пометить свойство как идентичность в модели:

public class OrderLine
{
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int OrderLineId { get; set; }

    [Key, ForeignKey("Order"), Column(Order = 1)]
    public int OrderId { get; set; }

    public virtual Order Order { get; set; }

    // ...
}

DatabaseGeneratedOption.Identity означает, что EF ожидает, что значение столбца генерируется в базе данных, и, следовательно, не отправляет значение в БД при попытке вставить новый объект.

Другие вопросы по тегам