由于在同一 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 中删除标识列