识别关系并插入子实体会导致“无法在表中插入标识列的显式值”

时间:2012-06-15 13:00:36

标签: entity-framework entity-framework-4.3

我正在努力让识别关系在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)

1 个答案:

答案 0 :(得分:7)

我认为异常意味着表OrderLines中的一个复合主键列是数据库中的自动生成标识(我想列OrderLineId)但EF确实发送了一个值({{ 1}}因为在INSERT语句中为此列创建新列0时没有为数据库指定属性,因为该属性未在EF模型中标记为标识。默认情况下(= OrderLineIDENTITY_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。