C# Can';t插入实体框架重复密钥异常

C# Can';t插入实体框架重复密钥异常,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有以动物实体和Id作为标识列的上下文 这是动物的定义: public class Animal { [Key, Column(Order = 0)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Name { get; set; } } 收集中只有一种动物: Animals: [{ Id: 1, Na

我有以动物实体和Id作为标识列的上下文

这是动物的定义:

public class Animal
{
    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
}
收集中只有一种动物:

Animals: [{
    Id: 1,
    Name: "Dog"
  }].
我想插入具有以下代码的新动物:

context.Animals.Add(new Animal { Name: "Cat" })
引发以下异常:

System.InvalidOperationException:'实体类型的实例 无法跟踪“Animal”,因为此类型的另一个实例具有 已在跟踪同一密钥


你使用哪个数据库?如果它是Microsoft.EntityFrameworkCore.InMemory中的
InMemoryDatabase
,并且第一个动物添加了显式id(通过
context.Animals.Add(新动物{id:1,名称:“Cat”})
),则
InMemoryDatabase
不会增加用于id设置的内部标识计数器。因此,当您和第二只动物,
在MemoryDatabase
中尝试将
Id
设置为
1
,但已经有动物具有此
Id
,因此引发异常

您有两种解决方案:

  • 删除了第一个动物的显式id(我更喜欢这个)
  • 第二个显式设置id(和所有下一个动物)

哪一行生成异常-
添加
保存更改
?似乎EF已经跟踪了
动物
实体。您需要使用已跟踪的实体添加新数据(还提供引发异常的部分代码)。我猜您正在尝试插入相同的密钥,即Id:1@IvanStoevAdd正在生成异常。问题中显然没有显示某些内容。需要。这正是发生的情况,因此我添加了两个可能的解决方案第三个选项(强烈建议):不要在MemoryDatabase中使用
,而是针对实际数据库进行测试(集成测试)。您不应该仅仅为了满足单元测试而更改代码。