【发布时间】:2015-09-18 01:11:15
【问题描述】:
我正在尝试将唯一列中的值交换为两行(或更多行)。例如:
更新前:
- 第 1 行 = 1
- 第 2 行 = 2
更新后:
- 第 1 行 = 2
- 第 2 行 = 1
我正在使用实体框架。这些更改发生在同一上下文的单个提交上。但是,当我尝试此更新时,总是会遇到唯一的约束冲突。 EF 没有使用事务吗?
为了完整起见,这里是我的表格设计的 sn-p:
[FeeSchemeId] UNIQUEIDENTIFIER NOT NULL,
[SortPosition] INT NOT NULL,
UNIQUE (FeeSchemeId, SortPosition)
我正在尝试更新“SortPosition”列。此处显示的代码有点复杂,但我可以向您保证,它是与单个最终提交相同的上下文。该错误仅在 EF 尝试写入数据库时引发。
更新:
- 使用 SQL Server Profiler,我可以看到 EF 正在为每个受影响的行运行单独的 UPDATE。 EF 不应该对 SaveChanges() 的一次调用使用单个事务吗? -
更新 2:
事实证明 EF 毕竟使用的是单个事务。 SQL Profiler 正在过滤掉它。
【问题讨论】:
-
"EF 没有使用事务吗?" - 这取决于您正在运行的查询类型 (see this article)。假设它是一个 UPDATE 查询(应该是),它应该将它包装在一个事务中。
-
您可能必须使其中一个键为空,或者删除并重新插入行(假设这只是一个连接表)。
-
根据 SQL 分析器。 EF 正在运行两个单独的语句来更新这两行。
-
你能展示一个精简版的 LINQ 查询吗?另外,即使执行了“两条单独的语句”,事务也在连接上,所以当异常发生时,这两个查询会一起回滚。
-
@TiesonT。我可以看到它通过使用类似的操作运行单独的语句,该操作不会对 UNIQUE 列进行任何更改。
标签: c# sql-server entity-framework unique-constraint