.net Linq和DeleteAllOnSubmit疼痛

.net Linq和DeleteAllOnSubmit疼痛,.net,linq,.net,Linq,下面的代码加载一个gig,清除gigs acts集合,然后添加一个新的act Data.LinqToSQL.Gig dbGig = DBContext.Gigs.Where(x => x.ID == myGigID).SingleOrDefault(); //Remove all references to the current acts if(dbGig.Acts!=null) {

下面的代码加载一个gig,清除gigs acts集合,然后添加一个新的act

            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的值都是相同的,因此我加载的gig总是相同的

我第一次运行这段代码的时候,它运行得很好,我有一个1幕的演出

第二次,dbGig.Acts(集合)的计数为0,因此DeleteAllOnSubmit不会删除任何ACT。然而,在数据库中,这场演出有1场演出!因此,一旦该代码运行,我将执行两个操作

如果我第三次运行它,我最终总共有3个动作


你知道我做错了什么吗?

好吧,你从来没有把新的表演和任何演出联系起来过——这就是我所缺少的吗

dbGig.Acts.Add(dbAct);
或者可能:

dbAct.Gig = dbGig;
或者有身份证的东西


i、 e.您确定db中的act是针对gig的吗?

尝试在该块开头打开一个新的DBContext。如果在第一次和第二次运行时使用相同的上下文,则在第二次运行时它不会看到插入的记录。重置上下文将强制它查看表中最新的行。

gfrizzle回答的另一个选择是,除非您有令人信服的理由这样做,否则在完成所有数据库工作之前不要调用SubmitChanges。

我也有类似的问题,在我的例子中,问题/解决方案是表示数据库表的内部类缺少主键的一部分

在数据库中的数据导致数据库满意的代码中出现主键约束之前,这似乎工作正常

PT