2008-12-30 28 views
2

以下代碼加載gig,清除gigs acts集合,然後添加新的行爲。Linq和DeleteAllOnSubmit pain

  Data.LinqToSQL.Gig dbGig = DBContext.Gigs.Where(x => x.ID == myGigID).SingleOrDefault(); 

      //Remove all references to the current acts 
      if(dbGig.Acts!=null) { 
       DBContext.Acts.DeleteAllOnSubmit(dbGig.Acts); 
      } 

      Data.LinqToSQL.Act dbAct = new ListenTo.Data.LinqToSQL.Act(); 
      dbAct.ID = Guid.NewGuid(); 
      DBContext.Acts.InsertOnSubmit(dbAct); 

      DBContext.SubmitChanges(); 

請注意,每次我運行此代碼,myGigID的價值是一樣的,所以它總是說我加載相同的演出。

我第一次運行這個代碼,它工作正常,我有一個演出的演出。

第二次,dbGig.Acts(集合)的計數爲0,因此DeleteAllOnSubmit不會刪除任何動作。但是在數據庫中,這個演出有1個動作!因此,一旦這段代碼運行,我最終會得到2個行爲。

如果我第三次運行它,我總共會有3個動作。

任何想法我做錯了什麼?

回答

0

那麼,你從來沒有真正將新行爲與任何演出聯繫起來 - 那是什麼遺漏?

dbGig.Acts.Add(dbAct); 

或可能:

dbAct.Gig = dbGig; 

或與IDS的東西。

即你確定數據庫中的行爲是爲演出嗎?

2

嘗試在此塊的開頭打開新的DBContext。如果您在第一次和第二次運行時使用相同的上下文,它將不會再次看到插入的記錄。重置上下文應該強制它查看錶格中的最新行。

1

gfrizzle答案的替代方法是,除非您有充足的理由這麼做,否則直到完成所有數據庫工作後再調用SubmitChanges。

0

我有類似的問題,在我的情況下,問題/解決方案是代表數據庫表的內部類缺少主鍵的一部分。

這似乎工作正常,直到數據庫中的數據導致數據庫滿意的代碼中的主鍵約束。

PT