Luk*_*lin 5 c# sql-server entity-framework unique-constraint
我正在尝试将两个(或更多行)的唯一列中的值交换.例如:
更新前:
更新后:
我正在使用实体框架.这些更改发生在同一上下文的单个提交中.但是,当我尝试此更新时,我总是会遇到一个独特的约束违规.EF没有使用交易吗?
为了完整起见,这是我的表格设计的片段:
[FeeSchemeId] UNIQUEIDENTIFIER NOT NULL,
[SortPosition] INT NOT NULL,
UNIQUE (FeeSchemeId, SortPosition)
Run Code Online (Sandbox Code Playgroud)
我正在尝试更新'SortPosition'列.这里显示的代码有点复杂,但我可以向您保证,它与单个最终提交的上下文相同.仅当EF尝试写入数据库时才会引发错误.
更新:
-
使用SQL Server Profiler我可以看到EF为每个受影响的行运行单独的UPDATE.如果EF没有使用单个事务来调用SaveChanges()吗?
-
更新2:
事实证明,EF毕竟使用单一交易.SQL事件探查器正在过滤掉它.
对于 SQL Server,您也无法使用 2 个语句来完成此操作。您需要使用第三个值
BEGIN TRANSACTION;
UPDATE MyTable Set Id = 200 where Id = 1;
UPDATE MyTable Set Id = 1 where Id = 2;
UPDATE MyTable Set Id = 2 where Id = 200;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,SQL Server 探查器显示 BEGIN TRANSACTION/COMMIT 语句