如何在EntityFramework 4中保存子实体?

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

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

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

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

那么我做错了什么?

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

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

  • OrderContact表中只有一个PK列可以是自动生成的标识。 我假设它是Order表。
  • 如果在分配新Contact之前order已经有Contact ,则必须从数据库中明确删除旧联系人,因为您不能拥有两个具有相同OrderId的联系人,因为它同时是PK。
  • 因为Contact表没有标识列,所以必须在代码中手动提供PK,它必须是订单的PK。

把它放在一起,它可能看起来像:

 context.Orders.Attach(order); if (order.Contact != null) context.DeleteObject(order.Contact); order.Contact = new Contact() { OrderId = order.Id, EmailAddress = "hello" }; context.SaveChanges(); 

这假定1)旧订单。如果在分配新订单之前已经存在联系人,则将联系人加载到订单对象中; 2)联系人的订单属性OrderId是PK属性。

只是一个猜测,但我认为你需要为你的联系对象设置PK。 当你没有主键null时,entity framework不喜欢它。

新合同尚未添加:

 context.Orders.Attach(order); context.AddToContractSet(order.Contract); context.SaveChanges(); 

这假设order已经在数据库中,并且您正在附加,因为它最初来自另一个上下文。 如果没有,请执行以下操作:

 context.AddToORdersSet(order); context.SaveChanges();