在具有种子实体的表中添加数据后出现重复键错误

Posted

技术标签:

【中文标题】在具有种子实体的表中添加数据后出现重复键错误【英文标题】:Duplicate key error after adding data in a table with seeded entities 【发布时间】:2021-10-09 14:14:08 【问题描述】:

情况如下:我正在使用 .NET 5 和 Entity Framework。我有一个播种机,看起来像这样:

    public static void Seed(this ModelBuilder modelBuilder)
    
        Entity[] entities = new Entity[]
        
            new Entity
            
                Id = 1,
                Description = "Test description 1"
            ,
            new Entity
            
                Id = 1,
                Description = "Test description 1"
             
        
    

我的实体如下,没什么特别的:

public class Entity 

    [Key]
    public ins Id  get; set; 

    public string Name  get; set; 

    public string Description  get; set; 
    
    public IList<AnotherEntity> AnotherEntity  get; set;  = new List<AnotherEntity>();

我想向数据库中添加另一个实体(我正在使用 mysql),而不是直接从数据库中,而是使用 EF,但是当我尝试这样做时(调用 .SaveChanges()),我收到一条错误消息,指出那里是PK中的重复,因为EF不理解这个表里已经有数据了。

我可以处理此问题的最佳方法是什么?

谢谢!

【问题讨论】:

你能发布你的表定义和模型构建器的相关部分来配置Entity吗?我认为这可能有助于缩小问题范围 @YoannaKostova 在实体模型(代码优先)或 SQL Mgmt Studio(数据库优先)中将 Microsoft Identity 添加到您的 PK 字段中 @GarethD 实体非常简单,问题不在于该属性的关系,而更多来自EF没有捕捉到已经存在种子数据并从1开始计数的事实,从那里出现问题。这是我得到的错误:MySqlConnector.MySqlException (0x80004005): Duplicate entry '2' for key 'entity.PRIMARY'。 【参考方案1】:

我发现如果在 OnModelCreating 方法中添加:

    protected override void OnModelCreating(ModelBuilder builder)
    
        builder.Entity<MyEntity>().Property(b => b.Id).ValueGeneratedOnAdd();
    

数据库设法了解已经存在种子数据并生成不重复的 Id。

【讨论】:

以上是关于在具有种子实体的表中添加数据后出现重复键错误的主要内容,如果未能解决你的问题,请参考以下文章

多个添加的实体可能在数据库种子上具有相同的主键

使用实体框架将行插入到具有复合键的表中

实体框架:如何从具有复合键的表中返回一行?

已添加具有相同键的项-查询中没有重复列

sql server 2000 列添加identity标识 出现错误时,弹出警告,清除警告后再次输入数据,标识会丢失一个

向实体框架模型添加键以满足需要键?