2012-09-23 116 views
2

我使用.NET4.5/EF5並從現有數據庫創建模型。實體框架5 SaveChanges上的外鍵新記錄

我用下面的代碼:

Order currentOrder = new Order(); 
using (var db = new ILSEntities()) 
{ 
    try 
    { 
     Event currentEvent = db.Events.OrderByDescending(u => u.EventID).FirstOrDefault(); 
     currentOrder.Event = currentEvent; 
     db.Orders.Add(currentOrder); 

     db.SaveChanges(); 

而且我看到正在創建Event對象,我覺得,這不是我想要發生的重複記錄。

我讀過很多關於類似問題的帖子,但是外鍵關係中兩個參與者的上下文是不同的。在這裏,我用我用來找到的上下文來保存,而另一個對象是新的。

我也試過:

currentOrder.Event.EventID = currentEvent.EventID; 

,但還是失敗,那麼我得到的EF驗證錯誤,告訴我它需要值的事件對象的其他成員。

我也試過專門設置對象的EntityState被複制到DetachedModified等加入Order對象之後,但SaveChanges沒有成功之前。

我敢肯定,這是一個基本的問題,但它讓我百思不得其解

+1

嘗試在'db.Orders.Add(currentOrder);'行後面調用'currentOrder.Event = currentEvent;'。 – nemesv

+0

感謝您的幫助。不幸的是,這也沒有工作 –

+2

是你正在使用的*確切*代碼?你顯示的內容不能創建一個新的'Event',因爲當你加載事件時,它被附加到狀態爲'Unchanged'的上下文中。 – Slauma

回答

2

在我的理解,無論是父母和孩子的對象必須是在上下文分配它們之間沒有任何關係,說服實體框架之前一個實體已經存在於數據庫中。我猜你正在嘗試添加新的Order對象到數據庫中,爲了添加你應該使用AddObject方法的新對象,使用Add()方法建立Entitties之間的關係。在您的代碼中,currentOrder不在上下文中。嘗試將其掛在同一個上下文中,然後分配一個關係。你的代碼應該是這樣的:

Order currentOrder = new Order(); 
using (var db = new ILSEntities()) 
{ 
    try 
    { 
     Event currentEvent = db.Events.OrderByDescending(u => u.EventID).FirstOrDefault(); 
     db.Orders.Attach(currentOrder); //attach currentOrder to context as it was not loaded from the context 
     currentOrder.Events.Add(currentEvent);//establish relationship 

     db.ObjectStateManager.ChangeObjectState(currentOrder, EntityState.Added); 

     db.SaveChanges(); 
} 
} 
+1

。不幸的是,ILSEntities沒有ObjectStateManager –

2

好的,我最終確定了這一點,這是我的錯。

問題在於Order對象被FK放入另一個表Shipments中,它也被FK鍵入Events中。問題在於它是Shipment對象中導致新記錄的事件引用。解決方案是讓EF通過在相同的上下文中添加它們來了解這些關係。

組裝對象圖的代碼分佈在多個web表單中,這裏的回答使我退後一步,嚴格地看待整個事情,雖然沒有一個答案是正確的,但我正在投票的每個人回覆