【问题标题】:Linq and DeleteAllOnSubmit painLinq 和 DeleteAllOnSubmit 痛苦
【发布时间】:2008-12-30 14:58:23
【问题描述】:

以下代码加载一个 gig,清除 gigs 行为集合,然后添加一个新行为。

            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 不会删除任何行为。然而,在数据库中,这个演出有 1 个动作!因此,一旦此代码运行,我最终会执行 2 次操作。

如果我第三次运行它,我总共会完成 3 幕。

任何想法我做错了什么?

【问题讨论】:

    标签: .net linq


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      gfrizzle 的答案的替代方法是,除非您有令人信服的理由这样做,否则在完成所有数据库工作之前不要调用 SubmitChanges。

      【讨论】:

        【解决方案3】:

        嗯,你从来没有真正将新表演与任何演出联系起来——这就是缺少的吗?

        dbGig.Acts.Add(dbAct);
        

        或者也许:

        dbAct.Gig = dbGig;
        

        或带有 id 的东西。

        即你确定 db 中的行为是为了演出吗?

        【讨论】:

          【解决方案4】:

          我遇到了类似的问题,我的问题/解决方案是表示数据库表的内部类缺少主键的一部分。

          这似乎工作正常,直到来自数据库的数据导致数据库满意的代码中的主键约束。

          PT

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-24
            • 1970-01-01
            • 2016-01-25
            • 2012-02-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多