C# 实体框架5唯一密钥冲突
给定以下数据库设计: 并使用以下示例数据: 如何删除NodeId=3的记录,然后更新其余记录上的行号,使它们以10为增量保持顺序 下面的代码突出显示了我的尝试,但是当我调用SaveChanges时,我当前得到一个唯一的键约束冲突异常 我假设这与SQL语句的顺序有关,或者与上下文缓存中未正确更新的内容有关。 如果在更新冲突行之前更新了行号,我希望看到唯一键冲突,但我先删除该行 在我看来,这是一个过程: 步骤1上下文、实体和数据库同步 步骤2删除节点ID==3的节点 步骤3更新剩余节点的行号 步骤4.保存上下文更改 我想这就是SQL的执行顺序。 由于唯一约束仅存在于数据库中,因此将发生冲突。但是,考虑到下面的顺序,我不理解为什么会发生冲突,因为没有重复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更新剩余节点的行号 步骤
//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