由于在同一 SaveChanges 中删除的记录中的值,实体更新在唯一索引上失败

Posted

技术标签:

【中文标题】由于在同一 SaveChanges 中删除的记录中的值,实体更新在唯一索引上失败【英文标题】:Entity update fails on unique index because of value in record deleted in the same SaveChanges 【发布时间】:2016-06-20 13:13:09 【问题描述】:

给定以下 Persons 表:

CREATE TABLE Persons (
    ID INT IDENTITY(1,1) NOT NULL,
    Name NVARCHAR(50),
    NationalCode INT NULL,
    CONSTRAINT [PK_Persons] PRIMARY KEY ([PersonID] ASC)
)
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_Persons]
    ON [dbo].[Persons]([NationalCode] ASC) WHERE ([NationalCode] IS NOT NULL);
GO

以及下面对应的实体类:

Public Class Person
    Property ID As Integer
    Property Name As String
    Property NationalCode As Integer?
End Class

以下代码在SaveChanges 处失败:

Dim dcx = New MyDataContext
Dim person1 = dcx.Persons.Find(128581)
Dim person2 = dcx.Persons.Find(128603)
person2.NationalCode=person1.NationalCode '200362226
dcx.Persons.Remove(person1)
dcx.SaveChanges

在索引上出现以下错误:

无法在具有唯一索引“IX_Persons”的对象“dbo.Persons”中插入重复的键行。重复键值为 (200362226)。 声明已终止。

我该如何解决这个问题(不删除第一条记录,调用SaveChanges,然后才修改第二条记录)?

注意Index(IsUnique=True)在这里有什么作用吗?


在 C# 中:

public class Person 
    int ID get;set;
    string Name get;set;
    int NationalCode get;set;


var dcx = new MyDataContext();
var person1 = dcx.Persons.Find(128581);
var person2 = dcx.Persons.Find(128603);
person2.NationalCode = person1.NationalCode; //200362226
dcx.Persons.Remove(person1);
dcx.SaveChanges();

【问题讨论】:

【参考方案1】:

您不能强制 EF 先执行删除语句。在一个事务中完成它的唯一方法是将语句包装在 TrasactionScope 中并调用 SaveChanges 两次:

Using ts = New TransactionScope()
    Dim dcx = New MyDataContext
    Dim person1 = dcx.Persons.Find(128581)
    Dim person2 = dcx.Persons.Find(128603)
    dcx.Persons.Remove(person1)
    dcx.SaveChanges
    person2.NationalCode=person1.NationalCode '200362226
    dcx.SaveChanges
    ts.Complete()
End Using

【讨论】:

以上是关于由于在同一 SaveChanges 中删除的记录中的值,实体更新在唯一索引上失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的程序中记录从 DbContext.SaveChanges() 生成的 SQL? [复制]

entity framework 使用存储过程删除数据后,还用再使用SaveChanges()保存吗?

从数据库优先实体框架 6.2 中的 SaveChanges 中删除标识列

覆盖 SaveChanges 并删除 EF 关系时为 null

在 SaveChanges 的实体框架中出现错误

是否可以在 Oracle10g 中的同一查询中进行插入和删除?