2008-12-30 63 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