0

我正在製作一個Windows Phone 7.1應用程序,並且在提交對數據庫的更改時遇到了很多麻煩。這裏是我的數據庫中的表的結構:如何在LinqToSql中相關的多個表上提交更改?

日< -1 ----- * - > TrainingSession < -many ----- 1->體育

所以,一天能有許多訓練課程,訓練課程有一項運動。一項運動可以自然地進行許多不同的訓練。

的主鍵是這樣的: 日 - 日期時間 TrainingSession - INT(DB生成的) 體育 - 爲nvarchar(200)

體育只會有屬性sportName和iconFileName。

我已經把EntitySet的白天和體育成立協會,並TrainingSession具有的EntityRef和的EntityRef。如果運動需要EntitySet,我不能100%確定,所以如果我錯了,請糾正我。目前,我只是在我的Sport課程中對一些體育項目進行了硬編碼測試,並且您會看到我獲取ObservableCollection以獲取這些體育項目。

這裏是我想創建天的培訓課程的集合,每次訓練有不同的運動項目:

public void CreateDay(DateTime date) 
    { 
     FitPlanDataContext calendarDatabase = new FitPlanDataContext(FitPlanDataContext.ConnectionString); 
     DateTime firstDate = new DateTime(date.Year, date.Month, 1); 

     DayItem dayItem = new DayItem(); 
     dayItem.DateTime = firstDate; 

     fillTestDayItemWithRandomData(dayItem); 

     calendarDatabase.DayItems.InsertOnSubmit(dayItem); 
     calendarDatabase.SubmitChanges(); 
    } 

    private void fillTestDayItemWithRandomData(DayItem dayItem) 
    { 
     ObservableCollection<SportArt> sportArtCollection = SportArtController.GetAllSports(); 

     dayItem.TrainingSessions = new EntitySet<TrainingSession>(); 
     ObservableCollection<TrainingSession> trainingSessionCollection = new ObservableCollection<TrainingSession>(); 

     TrainingSession trainingSession1 = new TrainingSession(); 
     trainingSession1.DayItem = dayItem; 
     trainingSession1.SportArt = sportArtCollection[1]; 
     trainingSessionCollection.Add(trainingSession1); 

     TrainingSession trainingSession2 = new TrainingSession(); 
     trainingSession2.DayItem = dayItem; 
     trainingSession2.SportArt = sportArtCollection[2]; 
     trainingSessionCollection.Add(trainingSession2); 

     FitPlanDataContext calendarDatabase = new FitPlanDataContext(FitPlanDataContext.ConnectionString); 
     calendarDatabase.TrainingSessions.InsertAllOnSubmit<TrainingSession>(trainingSessionCollection); 
    } 

此代碼是不是爲我工作,和它給我下面的錯誤:

NotSupportedException was Unhandled: An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.

在我得到這個錯誤之前,我還得到了NullReferenceExceptions。

我一直在四處尋找一個解決方案,我看到一些人使用的分離或變通方法與附着,但我還沒有想通了,我如何能實現它向我的代碼。任何人都可以幫我一個忙嗎?

另外,我認爲NullReferenceException異常可能是從我沒有保存任何運動到數據庫的事實來了,這會是這樣呢?

回答

0

所以我把事情搞糟與它周圍的很多,今天我終於找到了我一直在尋找的解決方案。

看來我問的問題是錯誤的。我沒有包含來自數據庫的查詢,這可能很重要。我實際上忽略了很多代碼,以便在我的問題中保持簡單,但看起來我省略了太多。

不管怎麼說,這變成這樣我設置數據庫的結構是正確的,並沒有什麼必須有改變。

所以我做了以下工作:
- 在提交有關日期的變化後,需要通過培訓課程填寫一天的方法。這是因爲日子裏有訓練課程,我不能在數據庫中保存訓練課程。

-I在我需要使用datacontext的地方使用語句添加,而不是僅使用局部變量創建datacontext的實例。這確保數據上下文僅存在於使用陳述的範圍內。

(我改變了一天的日期時間要在日期給出的參數的方法)

public void CreateDay(DateTime date) 
{ 
    DayItem dayItem = new DayItem(); 
    dayItem.DateTime = date; 

     using (FitPlanDataContext calendarDatabase = new FitPlanDataContext(FitPlanDataContext.ConnectionString)) 
     { 
      calendarDatabase.DayItems.InsertOnSubmit(dayItem); 
      calendarDatabase.SubmitChanges();     
     } 

    fillTestDayItemWithRandomData(dayItem); 
} 

然後,修改與培訓課程填補了當天的方法是這樣的:

- 我打開一個使用語句,我實例化一個新的數據上下文。然後我訪問數據庫來檢索所有運動的列表,以及我需要更新的那一天。我發現我需要通過dayItemParameter進行更新。 (請記住,從數據庫檢索會給你一個集合。)

- 我創建了我的新培訓課程並填寫其屬性。請注意,從數據庫檢索到的日子是培訓會話屬性的價值,因爲培訓課程是一天的孩子,需要知道其父母日是誰。

-I刪除了EntitySet的實例,因爲我意識到我已經在DayItem類的構造函數中實例化它。

- 最後,我將所有新的培訓課程添加到一個集合中,並使用InsertAllOnSubmit(集合)一次性將它們全部保存到數據庫中。

private void fillTestDayItemWithRandomData(DayItem dayItemParameter) 
{ 
     using (FitPlanDataContext calendarDatabase = new FitPlanDataContext(FitPlanDataContext.ConnectionString)) 
     { 
      ObservableCollection<SportArt> sportArtCollection;   
      var sportArts = (from SportArt sportArt in calendarDatabase.SportArts 
           select sportArt); 
      sportArtCollection = new ObservableCollection<SportArt>(sportArts); 

      ObservableCollection<DayItem> dayItemCollection; 
      var dayItems = (from DayItem dayItem in calendarDatabase.DayItems 
          where dayItem.DateTime == dayItemParameter.DateTime 
          select dayItem); 
      dayItemCollection = new ObservableCollection<DayItem>(dayItems); 

      DayItem foundDayItem = dayItemCollection[0]; 

      ObservableCollection<TrainingSession> trainingSessionCollection = new ObservableCollection<TrainingSession>(); 

      TrainingSession trainingSession1 = new TrainingSession(); 
      trainingSession1.DayItem = foundDayItem; 
      trainingSession1.SportArt = sportArtCollection[1]; 
      trainingSessionCollection.Add(trainingSession1); 

      TrainingSession trainingSession2 = new TrainingSession(); 
      trainingSession2.DayItem = foundDayItem; 
      trainingSession2.SportArt = sportArtCollection[2]; 
      trainingSessionCollection.Add(trainingSession2); 


      calendarDatabase.TrainingSessions.InsertAllOnSubmit<TrainingSession>(trainingSessionCollection); 
      calendarDatabase.SubmitChanges(); 
     } 
} 

結論:

我遇到的主要問題是,我試圖培訓班保存到沒有提交到數據庫的一天。下一個大問題(我認爲很多人都有)是讀取和更新實體必須在同一個數據上下文中。因此,您無法創建datacontext來檢索一天,然後使用另一個datacontext將培訓會話添加到當天(即使您將當天的值保存到本地變量中)。您需要檢索一天,並將所有訓練課程保存到同一數據上下文中。

目前,我的應用程序正在工作,但它非常緩慢。在這個問題中,我只問了一天,但在我的實際程序中,我創建了數百天,這意味着數據庫的開放和關閉很多。如果有人有建議,我可以如何優化過程,我是開放的耳朵。

我意識到並且道歉這篇文章有這麼長時間,但是寫它幫助我更深入地瞭解情況,我真的希望它也能幫助別人。