我正在努力让识别关系在Entity Framework中工作,这样我就可以使用Remove删除其集合中的项目。
我创建了一个类似的测试:
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();
我收到错误
无法在表中插入identity列的显式值 当IDENTITY_INSERT设置为OFF时,'OrderLines'。
当我查看表时,SQL有一个主键,而不是OrderId和OrderLineId。此外,只有OrderLineId被设置为标识。所以它必须尝试插入一个值,但它似乎尝试插入的唯一值是0。
我可以使用以下方法插入表中的任何想法:
INSERT INTO [OrderLines]
([ProductId ]
,[Number]
,[OrderId])
VALUES
(2
,1
,1)
答案 0 :(得分:7)
我认为异常意味着表OrderLines
中的一个复合主键列是数据库中的自动生成标识(我想列OrderLineId
)但EF确实发送了一个值({{ 1}}因为在INSERT语句中为此列创建新列0
时没有为数据库指定属性,因为该属性未在EF模型中标记为标识。默认情况下(= OrderLine
为IDENTITY_INSERT
)SQL Server不允许显式地将值插入标识列。
确实在映射中,键列不是标识,因为默认情况下,复合键中没有属性是标识。
我认为,解决方案是要么关闭数据库中的身份规范,要么将该属性标记为模型中的身份:
OFF
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; }
// ...
}
表示EF期望在数据库中生成列值,因此在您尝试插入新实体时不会将值发送到DB。