Идентификация отношений и вставка дочерних объектов приводит к "Невозможно вставить явное значение для столбца идентичности в таблице"
Я пытаюсь заставить идентифицирующие отношения работать в 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 ожидает, что значение столбца генерируется в базе данных, и, следовательно, не отправляет значение в БД при попытке вставить новый объект.