Entity framework 6 实体框架插入错误?

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

我首先使用了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 = 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()
时遇到了同样的问题,但我现在明白了。谢谢你的解释。