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# 实体框架5唯一密钥冲突_C#_Entity Framework_Entity Framework 5_Constraints - Fatal编程技术网

C# 实体框架5唯一密钥冲突

C# 实体框架5唯一密钥冲突,c#,entity-framework,entity-framework-5,constraints,C#,Entity Framework,Entity Framework 5,Constraints,给定以下数据库设计: 并使用以下示例数据: 如何删除NodeId=3的记录,然后更新其余记录上的行号,使它们以10为增量保持顺序 下面的代码突出显示了我的尝试,但是当我调用SaveChanges时,我当前得到一个唯一的键约束冲突异常 我假设这与SQL语句的顺序有关,或者与上下文缓存中未正确更新的内容有关。 如果在更新冲突行之前更新了行号,我希望看到唯一键冲突,但我先删除该行 在我看来,这是一个过程: 步骤1上下文、实体和数据库同步 步骤2删除节点ID==3的节点 步骤3更新剩余节点的行号 步骤

给定以下数据库设计:

并使用以下示例数据:

如何删除NodeId=3的记录,然后更新其余记录上的行号,使它们以10为增量保持顺序

下面的代码突出显示了我的尝试,但是当我调用SaveChanges时,我当前得到一个唯一的键约束冲突异常

我假设这与SQL语句的顺序有关,或者与上下文缓存中未正确更新的内容有关。 如果在更新冲突行之前更新了行号,我希望看到唯一键冲突,但我先删除该行

在我看来,这是一个过程:

步骤1上下文、实体和数据库同步

步骤2删除节点ID==3的节点

步骤3更新剩余节点的行号

步骤4.保存上下文更改

我想这就是SQL的执行顺序。 由于唯一约束仅存在于数据库中,因此将发生冲突。但是,考虑到下面的顺序,我不理解为什么会发生冲突,因为没有重复

//Begin Transaction
DELETE FROM NODES WHERE NODEID = 3;
UPDATE NODES SET LINENUMBER = 30 WHERE NODEID = 4;
UPDATE NODES SET LINENUMBER = 40 WHERE NODEID = 5;
//End Transaction
答案似乎与我一致,这是预期的SQL命令序列

我尝试在更新行号之前和更新行号之后调用SaveChanges,但这会产生相同的错误

在循环中调用SaveChanges可以很好地工作,但是这些语句并不像我希望的那样在单个事务中执行

我似乎记得实体框架中有一些东西允许您指定SQL语句的执行顺序,但我不记得方法名称。搜索谷歌到目前为止没有任何帮助,我仍在寻找

我可能还需要插入记录并根据需要更新行号,任何解决方案都应牢记这一点

谢谢,
菲尔

如果你叫SaveChanges 1。在移除节点2之后。在每个FielNoMo改变之后,在FACH循环中,我将给出一个GO,但是,如果可能的话,我宁愿保持这个在一次事务上。那么,你可以把所有这些都放到一个事务中,在中间保存变量,并在最后提交事务……把Savechange放入循环中似乎已经解决了这个问题。我的理解是,调用SaveChanges时执行的所有SQL都在单个事务中运行。如何更新此代码以确保仅使用单个事务?您可以查看以下示例:
Context                                       Task.Nodes          Database
1 / AAA / 10 (EntityState=Unchanged)          1 / AAA / 10        1 / AAA / 10
2 / AAA / 20 (EntityState=Unchanged)          2 / AAA / 20        2 / AAA / 20
3 / AAA / 30 (EntityState=Unchanged)          3 / AAA / 30        3 / AAA / 30
4 / AAA / 40 (EntityState=Unchanged)          4 / AAA / 40        4 / AAA / 40
5 / AAA / 50 (EntityState=Unchanged)          5 / AAA / 50        5 / AAA / 50
Context                                      Task.Nodes           Database
1 / AAA / 10 (EntityState=Unchanged)         1 / AAA / 10         1 / AAA / 10
2 / AAA / 20 (EntityState=Unchanged)         2 / AAA / 20         2 / AAA / 20
3 / AAA / 30 (EntityState=Deleted=>Detached)  **deleted**         3 / AAA / 30
4 / AAA / 40 (EntityState=Unchanged)         4 / AAA / 40         4 / AAA / 40
5 / AAA / 50 (EntityState=Unchanged)         5 / AAA / 50         5 / AAA / 50
Context                                      Task.Nodes           Database
1 / AAA / 10 (EntityState=Unchanged)         1 / AAA / 10         1 / AAA / 10
2 / AAA / 20 (EntityState=Unchanged)         2 / AAA / 20         2 / AAA / 20
3 / AAA / 30 (EntityState=Deleted=>Detached)  **deleted**         3 / AAA / 30
4 / AAA / 40 (EntityState=Modified)          4 / AAA / 30         4 / AAA / 40
5 / AAA / 50 (EntityState=Modified)          5 / AAA / 40         5 / AAA / 50
//Begin Transaction
DELETE FROM NODES WHERE NODEID = 3;
UPDATE NODES SET LINENUMBER = 30 WHERE NODEID = 4;
UPDATE NODES SET LINENUMBER = 40 WHERE NODEID = 5;
//End Transaction