我首先使用EF 6.2.0 DB,SQL Server 2017
我创建了一个表格对此进行测试
create table Person
(
ID int primary key,
Name varchar(50)
)
我创建了一个要插入的表单,这是按钮单击事件:
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
Person p = new Person();
p.id = Convert.ToInt32(txbID.Text);
p.name = txbName.Text;
try
{
db.People.Add(p);
db.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine("###Ex:" + ex.ToString());
MessageBox.Show(ex.ToString());
}
}
首先,我插入一个ID = 1
人。
然后,我用ID = 1
插入另一个人,这导致了此异常:
System.Data.SqlClient.SqlException:违反主键约束'PK__Person__3213E83F397C4503'。无法在对象“ dbo.Person”中插入重复密钥。重复的键值为(1)。
最后,我插入一个ID = 2
人,它仍然显示相同的例外情况:
System.Data.SqlClient.SqlException:违反主键约束'PK__Person__3213E83F397C4503'。无法在对象“ dbo.Person”中插入重复密钥。重复的键值为(1)。
在第一个异常之后,插入任何ID将导致相同的异常The duplicate key value is (1)
。我认为这是一个错误。
答案 0 :(得分:1)
不,这不是错误-我怀疑您还不太了解DbContext
的工作原理。
当您尝试向第二个人插入ID = 1
时,这显然会产生错误,该对象(导致此错误)现在成为DbContext
(属于db.People
的一部分采集)。
如果您使用ID = 2
添加其他人,则您的ID=1
的“有问题”第二人仍是DbContext
({{1} })-除非,您已经专门清理过(删除了那个麻烦的人,或者完全创建了一个新的db.Person
)。
因此,在添加了DbContext
的人之后,您的ID = 2
现在有一个ID = 1的人和另一个ID = 2的人在呼叫DbContext
时将被保存-这将 OF COURSE 再次失败,并显示相同的错误-这是与以前相同的问题...
解决此问题的一种方法是在您的.SaveChanges()
方法内明确地创建DbContext
:
btnSubmit_Click