以下代码加载演出,清除演出动作集合,然后添加新动作。
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相同。
我第一次运行此代码时效果很好,而且我有一次演出。
第二次,dbGig.Acts(一个集合)的计数为0,因此DeleteAllOnSubmit不会删除任何行为。但是在数据库中,这个演出有1个动作!因此,一旦此代码运行,我最终会得到2个动作。
如果我第三次跑,我最终总共有3个动作。
任何想法我做错了什么?
答案 0 :(得分:2)
尝试在此块的开头打开一个新的DBContext。如果您在第一次和第二次运行时使用相同的上下文,则第二次看不到插入的记录。重置上下文应强制它查看表中的最新行。
答案 1 :(得分:1)
替代gfrizzle的答案是除非你有令人信服的理由这样做,否则在完成所有数据库工作之后不要调用SubmitChanges。
答案 2 :(得分:0)
好吧,你从未真正将新行为与任何演出联系起来 - 是缺少什么?
dbGig.Acts.Add(dbAct);
或者也许:
dbAct.Gig = dbGig;
或带有ids的东西。
即。你确定数据库中的行为是为了演出吗?
答案 3 :(得分:0)
我有类似的问题,我的问题/解决方案是代表数据库表的内部类缺少部分主键。
这似乎工作正常,直到数据库中的数据导致数据库满意的代码中的主键约束。
PT