Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 确定关系并插入子实体原因“;无法为表“中的标识列插入显式值”;_Entity Framework_Entity Framework 4.3 - Fatal编程技术网

Entity framework 确定关系并插入子实体原因“;无法为表“中的标识列插入显式值”;

Entity framework 确定关系并插入子实体原因“;无法为表“中的标识列插入显式值”;,entity-framework,entity-framework-4.3,Entity Framework,Entity Framework 4.3,我试图让标识关系在实体框架中工作,这样我就可以使用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

我试图让标识关系在实体框架中工作,这样我就可以使用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; }}
当我尝试添加订单行时,如:

        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时的“订单行”

当我查看表时,SQL在OrderId和OrderLineId上有一个主键。此外,只有OrderLineId设置为标识。因此,它必须尝试插入一个值,但它似乎唯一尝试插入的值是0

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

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

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

。这就解决了问题。现在我可以编写更好的代码来删除我的子实体了!