[英]How do I save a child entity in 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)舊order.Contact
加載到訂單對象,如果有已經是一個聯系你分配一個新的人之前和2)該財產OrderId
的Contact
是PK屬性。
只是一個猜測,但我認為你需要為你的聯系對象設置PK。 當你沒有主鍵null時,實體框架不喜歡它。
新合同尚未添加:
context.Orders.Attach(order);
context.AddToContractSet(order.Contract);
context.SaveChanges();
這假設order
已經在數據庫中,並且您正在附加,因為它最初來自另一個上下文。 如果沒有,請執行以下操作:
context.AddToORdersSet(order);
context.SaveChanges();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.