Entity framework 确定关系并插入子实体原因“;无法为表“中的标识列插入显式值”;
我试图让标识关系在实体框架中工作,这样我就可以使用remove从它们的集合中删除项 我创建了一个测试,如: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
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。。这就解决了问题。现在我可以编写更好的代码来删除我的子实体了!