Entity framework 6 实体框架插入错误?
我首先使用了EF 6.2.0 DB,SQL Server 2017 我创建了一个表来测试这个Entity framework 6 实体框架插入错误?,entity-framework-6,Entity Framework 6,我首先使用了EF 6.2.0 DB,SQL Server 2017 我创建了一个表来测试这个 create table Person ( ID int primary key, Name varchar(50) ) 我创建了一个要插入的表单,这是button click事件: private void btnSubmit_Click(object sender, RoutedEventArgs e) { Person p = new Person(); p.id
create table Person
(
ID int primary key,
Name varchar(50)
)
我创建了一个要插入的表单,这是button click事件:
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都将导致相同的异常
重复的键值为(1)
。我认为这是一个bug。不,这不是bug-我怀疑您还没有真正理解DbContext
的工作原理
当您尝试插入第二个ID为1的人时,显然会产生错误,该对象(导致此错误)现在是DbContext
(属于db.People
集合)的一部分
如果您添加另一个ID为2的人,您的ID为1的“有问题的”第二个人仍然是DbContext
(db.person
)-的一部分,除非您已经特别清理(删除了那个麻烦的人,或者创建了一个新的DbContext
)
因此,在添加ID=2的人之后,DbContext
现在有一个ID=1的人和另一个ID=2的人要在调用.SaveChanges()
时保存-当然,这将再次失败,并出现相同的错误-问题与以前一样
解决此问题的一种方法是在btnSubmit\u Click
方法中显式创建DbContext
:
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
using (var db = new YourDbContextType())
{
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());
}
}
}
不,这不是一个bug-我怀疑您还没有真正理解
DbContext
是如何工作的
当您尝试插入第二个ID为1的人时,显然会产生错误,该对象(导致此错误)现在是DbContext
(属于db.People
集合)的一部分
如果您添加另一个ID为2的人,您的ID为1的“有问题的”第二个人仍然是DbContext
(db.person
)-的一部分,除非您已经特别清理(删除了那个麻烦的人,或者创建了一个新的DbContext
)
因此,在添加ID=2的人之后,DbContext
现在有一个ID=1的人和另一个ID=2的人要在调用.SaveChanges()
时保存-当然,这将再次失败,并出现相同的错误-问题与以前一样
解决此问题的一种方法是在btnSubmit\u Click
方法中显式创建DbContext
:
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
using (var db = new YourDbContextType())
{
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());
}
}
}
我在
.Remove()
时也遇到了同样的问题,但我现在明白了。谢谢你的解释。我在.Remove()
时遇到了同样的问题,但我现在明白了。谢谢你的解释。