如何在Entity Framework 4中保存子实体?

时间:2011-04-15 16:29:03

标签: c# .net entity-framework-4.1 ef-code-first

订单和联系人之间存在1-1关系。即Contact.OrderId引用订单,也是PK。

所以我有一个现有的订单,我就像这样添加一个新的联系人......

    order.Contact = new Contact() { EmailAddress = "hello" };
    context.Orders.Attach(order);
    context.SaveChanges();
  

发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。

那么我做错了什么?

4 个答案:

答案 0 :(得分:3)

只需生成您的子实体,设置其OrderIdReference属性,您应该好好去。

答案 1 :(得分:1)

您与OrderContact表中的共享主键具有一对一的关系:联系人的PK必须始终与关联订单的PK相同。这有一些后果:

  • OrderContact表中只有一个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();