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将培训会话添加到当天(即使您将当天的值保存到本地变量中)。您需要检索一天,并将所有训练课程保存到同一数据上下文中。

目前,我的应用程序正在工作,但它非常缓慢。在这个问题中,我只问了一天,但在我的实际程序中,我创建了数百天,这意味着数据库的开放和关闭很多。如果有人有建议,我可以如何优化过程,我是开放的耳朵。

我意识到并且道歉这篇文章有这么长时间,但是写它帮助我更深入地了解情况,我真的希望它也能帮助别人。