Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将每个records int列的值更改1会引发重复错误_C#_Entity Framework_Linq - Fatal编程技术网

C# 将每个records int列的值更改1会引发重复错误

C# 将每个records int列的值更改1会引发重复错误,c#,entity-framework,linq,C#,Entity Framework,Linq,我的实体有一个列Order,该列的值必须是唯一的。我想创建一个函数,将每条记录的顺序增加1: MyEntities db = new MyEntities(); var entities = db.Entity.Where(e => e.Order > 10); foreach (var entity in entities) { entity.Order++; } db.SaveChanges(); 问题是在保存更改时。我得到一个错误,列Order上存在重复项。我怀疑它

我的实体有一个列
Order
,该列的值必须是唯一的。我想创建一个函数,将每条记录的
顺序增加1:

MyEntities db = new MyEntities();

var entities = db.Entity.Where(e => e.Order > 10);
foreach (var entity in entities)
{
    entity.Order++;
}
db.SaveChanges();

问题是在保存更改时。我得到一个错误,列
Order
上存在重复项。我怀疑它会逐行保存更改,当它保存第一个
订单
的更改时,下一个更改尚未处理,并且具有相同的值。我说得对吗?如何克服这个问题?

如果评论中的建议不适合您,您可以直接在SQL中编写如下代码:

        string Cmd = "UPDATE Entity SET [Order] = [Order] + 1 WHERE [Order] > 10 ";
        db.Database.ExecuteSqlCommand(Cmd);
或者,如果要使用EF选择数据集并从中构造SQL命令,请尝试以下操作:

            var entities = db.Entity.Where(e => e.Order > 10);
            string Cmd = string.Format("UPDATE Entity SET [Order] = [Order] + 1 WHERE [Order] in ({0})",string.Join(",", entities.Select(e => e.Order.ToString()).ToList()));
            db.Database.ExecuteSqlCommand(Cmd);

它的实体[i]。顺序正确吗?不是实体[i]。顺序。第二,关于评论,我不理解,因为如果您将I指定给Order,而不是Order+,那么将出现订单号重复的问题。并尝试添加此db.Entry(entities[i]).State=EntityState.Modified;按照@jdweng的建议,尝试对实体[i]进行反向计数。对代码进行排序,但添加一个db.SaveChanges();每次。@JonRoberts-我也这么想,但是当订单数量很大时,我觉得有那么多提交有点低效?@rootkonda可能,但我们不知道数据集的大小。或者,首先将它们全部设置为唯一的值(如实体[i]。顺序+1001),然后保存更改,然后再次循环以减去1000。计算越多,提交越少。如果它在更新过程中崩溃,那就太危险了@Pomme实体状态。修改不是我的建议。我在下面给出了另一种解决方案作为答案。这是否比发出多个SaveChanges更可取由您决定。问题是更新时有重复的列。在每次更新后应用“保存更改”时,它会起作用(请参见注释)。OP不想在每次迭代后都发布savechanges(参见注释),因此一次SQL更新也可以实现同样的效果。这是解决这个问题的有效办法。请删除你的否决票。如果你还没有完全理解这个问题,你怎么能否决一个答案?他正在增加一组订单ID。因此,ID 10变为11,但不应在ID 11变为12时创建副本。但是,当他更新所有ID AN然后调用SaveChanges时,第一次更新将ID 10更改为11,然后11将更新为12。因此会出现错误,以及每次发出保存更改的原因。OP不希望在循环中重复发布更新,因此这是一个有效的替代方案。我想我将使用这种方法,因为我从未在应用程序中创建过sql命令。创建存储过程并调用它们更好还是没有区别?在次要的事情上,
Order
需要放在方括号中,因为这个名称对于sql是唯一的。@Pomme我不知道有任何性能差异。是的,很好,因为Order是一个SQL关键字,所以需要方括号。