4

我试图让识别关系在实体框架中工作,这样我就可以使用 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_INSERT 设置为 OFF 时,无法在表“OrderLines”中插入标识列的显式值。

当我查看表时,SQL 在 OrderId 和 OrderLineId 上有一个主键。也只有 OrderLineId 被设置为身份。所以它必须尝试插入一个值,但它似乎试图插入的唯一值是 0。

我可以使用以下方法插入表格的任何想法:

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

1 回答 1

7

我相信异常意味着表中的复合主键列之一OrderLines是数据库中的自动生成标识(我猜是列OrderLineId),但 EF 确实发送了一个值(0因为您在创建新主键时没有指定属性OrderLine) INSERT 语句中的此列到数据库,因为该属性未在 EF 模型中标记为标识。默认情况下 (= IDENTITY_INSERTis 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 期望在数据库中生成列值,因此在您尝试插入新实体时不会将该值发送到数据库。

于 2012-06-15T13:16:56.250 回答