实体框架插入错误?

时间:2018-10-01 14:40:54

标签: entity-framework-6

我首先使用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)。我认为这是一个错误。

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