如何在EntityFramework 4中保存子实体?
订单和联系人之间有1-1的关系。 即Contact.OrderId引用订单,也是PK。
所以我有一个现有的订单,我就像这样添加一个新的联系人……
order.Contact = new Contact() { EmailAddress = "hello" }; context.Orders.Attach(order); context.SaveChanges();
发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。
那么我做错了什么?
只需生成您的子实体,设置其OrderIdReference
属性,您应该好好去。
在Order
和Contact
表中,您与共享主键具有一对一的关系: Contact
的PK必须始终与关联订单的PK相同。 这有一些后果:
-
Order
和Contact
表中只有一个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();