2009-10-27 132 views
1

如何設置屬性,以便在使用SaveChanges時保存多對一關係,並且不會導致:INSERT語句衝突與FOREIGN KEY約束...錯誤。實體框架/ .Net 4.0:POCO並保存多對一關係

很簡單,我有一個廣告和一個廣告類型,其中有很多廣告到一個AdType。廣告上有一個物業:

public class Ad 
{ 
    public Int32 AdTypeId { get; set; } 
    public virtual AdType AdType { get; set; } 
} 

爲了涵蓋這種關係。

當我這樣做:

someAd.AdType = someAdType; 

該屬性設置就好了,但AdTypeId不是。不用擔心,因爲我會認爲這可以保存。

context.SaveChanges(); 

問題是在這一點上,試圖保存在AdTypeId列中的0值(導致的外鍵的問題),而不是使用對象分配ADTYPE財產弄清楚它應該插入AdTypeId列。

事情我知道:

  • 此時someAdType是 堅持/有一個id。
  • AdType屬性設置正確。
  • AdTypeId爲0.
  • 數據庫中存在外鍵關係。
  • AdTypeId是主鍵。
  • 我已經延期/延遲加載設置爲true

我還沒有真正試圖改變ADTYPE因爲它被設置爲允許延遲加載。

回答

4

好吧,看起來像是因爲我使用的是非代理的(Made that word up ... Yah)「基於快照的變更跟蹤」方法,系統並沒有真正意識到它已被更改。

在此示例中,客戶是純粹的 POCO類型。不像EntityObject或 基於IPOCO實體,進行更改 到實體不會自動 保持狀態管理器保持同步,因爲 有你的純POCO實體和 實體框架之間沒有自動通知 。因此,當 查詢狀態管理器時,它認爲 客戶對象狀態爲 即使我們有 明確地對實體上的 屬性之一進行了更改,也不會改變。

Got that from here

因此,爲了確保它知道要檢查,看看是否出現了變化我不得不使用AcceptAllChangesAfterSave選項與SaveChanges方法。

context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave); 

和它的作品。希望我的理解正確...

+1

嘿,我面臨同樣的問題,並試圖用這個選項保存沒有成功。據我所知,AcceptAllChangesAfterSave不會嘗試檢測更改,而只會在保存後調用AcceptChanges(),使實體保持Unchanged狀態。如我錯了請糾正我。 – 2010-05-24 06:35:45