删除行后更新所有行ID

时间:2014-09-08 02:54:52

标签: sql asp.net-mvc entity-framework

我希望在删除行后更新所有行ID。例如:在行ID为1,2,3,4,5的记录集合中;如果2被删除则应为1,2,3,4。这是我的代码:

getID = Int32.Parse(forms.Get("IDNo"));
var ID = from x in db.tblServiceRegister_D
         where x.Company_Code == COMP && x.SR_No == SR_No
         select x.ID;
var maxID = ID.Max();

short loop = Convert.ToInt16(maxID - getID);
tblServiceRegister_D tblserviceregisterD = db.tblServiceRegister_D.Find(COMP,SR_No,getID);

db.tblServiceRegister_D.Remove(tblserviceregisterD);
            try
            {               
                db.SaveChanges();
                strResponse = "Record deleted";

                for (int i = 1; i <= loop; i++)
                {
                    short x = Convert.ToInt16(getID);
                    tblServiceRegister_D newIDForSRD = db.tblServiceRegister_D.Find(COMP, SR_No, x+1);

                    newIDForSRD.ID = x;
                 ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.ChangeObjectState(newIDForSRD, EntityState.Modified);
                 db.SaveChanges();
                    x++;

                }

            }

它只能在删除记录之前有效。 ID不仅仅是更新。需要帮助。

1 个答案:

答案 0 :(得分:0)

您可以应用一些逻辑来检查已删除的记录是否位于查看器索引的末尾,这样您就不会在不需要时更新记录,省略任何小于索引的索引号。刚删除等等,但是如果你有可能一次多次删除或者其他情况会导致难以或不可能只针对第n条或更高的记录,那么使用“霰弹枪方法”并执行声明可能会更安全在下面并使用context.ExecuteStoreCommand()来调用执行更新的存储过程,而不是迭代代码中表的内容并为每个单独的记录调用Save。当你的桌子越来越大时,性能可能会成为一个问题。现在,假设您希望用户可视索引遵循基于表的主键的顺序,您的SQL可能如下所示:

UPDATE myTable SET RowIndex = tbl.RowNum  
FROM myTable  
JOIN 
(SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) RowNum
FROM myTable) tmp 
ON 
myTable.ID = tmp.ID