簡體   English   中英

如何在EntityFramework 4中保存子實體?

[英]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屬性,您應該好好去。

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)舊order.Contact加載到訂單對象,如果有已經是一個聯系你分配一個新的人之前和2)該財產OrderIdContact是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM