订单和联系人之间存在1-1关系。即Contact.OrderId引用订单,也是PK。
所以我有一个现有的订单,我就像这样添加一个新的联系人......
order.Contact = new Contact() { EmailAddress = "hello" };
context.Orders.Attach(order);
context.SaveChanges();
发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。
那么我做错了什么?
答案 0 :(得分:3)
只需生成您的子实体,设置其OrderIdReference
属性,您应该好好去。
答案 1 :(得分:1)
您与Order
和Contact
表中的共享主键具有一对一的关系:联系人的PK必须始终与关联订单的PK相同。这有一些后果:
Order
和Contact
表中只有一个PK列可以是自动生成的标识。我认为它是Order
表。order
在分配新的Contact
之前已经有Contact
,则必须从数据库中明确删除旧联系人,因为您不能拥有两个具有相同OrderId的联系人,因为它是PK at同时。context.Orders.Attach(order);
if (order.Contact != null)
context.DeleteObject(order.Contact);
order.Contact = new Contact() { OrderId = order.Id, EmailAddress = "hello" };
context.SaveChanges();
表没有标识列,您必须在代码中手动提供PK,它必须是订单的PK。将它们放在一起,它可能看起来像:
order.Contact
这假定1)旧的OrderId
加载到订单对象中(如果在分配新的{1}}之前已经存在联系人,而2)Contact
的属性{{1}}是PK属性。
答案 2 :(得分:0)
只是一个猜测,但我认为你需要为你的联系对象设置pk。当你没有主键null时,实体框架不喜欢它。
答案 3 :(得分:0)
尚未添加新合约:
context.Orders.Attach(order);
context.AddToContractSet(order.Contract);
context.SaveChanges();
这假设order
已经在数据库中,并且您正在附加,因为它最初来自另一个上下文。如果没有,请执行以下操作:
context.AddToORdersSet(order);
context.SaveChanges();