有没有办法在实体框架迁移上播种数据。但我们不需要在播种时提供主键值

Posted

技术标签:

【中文标题】有没有办法在实体框架迁移上播种数据。但我们不需要在播种时提供主键值【英文标题】:Is there any way to seed data on entity framework migration. but we don't need to provide primary key value on seeding 【发布时间】:2021-11-11 11:12:40 【问题描述】:

模型类:

  public class Model
    
        [Key]
        public int Id  get; set; 
        public string Name  get; set; 
    

dbContext 类

    public class AppDbContext : DbContext
    
        public AppDbContext (DbContextOptions<AppDbContext> options)
            : base(options)
                
        
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        
            modelBuilder.Entity<Model>().HasData(
                new Model Name = "William",
                new Model  Name="Altaf"
            );
        
        public DbSet<DataSeedingEntityFramework.Model> Model  get; set; 
    

当我迁移 dbcontext 时显示此错误:

无法添加实体类型“模型”的种子实体,因为属性“Id”需要非零值。考虑提供一个负值以避免与非种子数据发生冲突。

我知道为什么会显示此错误,但我想在没有 Id 值的情况下进行迁移。它应该是自动递增的。

【问题讨论】:

【参考方案1】:

你应该添加

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

这将告诉 EF Core 该实体具有自动增量字段 ID。 要在迁移时启用数据种子,请将代码从 DbContext 类中的 OnModelCreating 方法移动到迁移类中的 Up 方法。详情请见this page。

【讨论】:

以上是关于有没有办法在实体框架迁移上播种数据。但我们不需要在播种时提供主键值的主要内容,如果未能解决你的问题,请参考以下文章

实体框架在播种数据库上插入重复项[重复]

Laravel 数据迁移

使用实体框架在 ASP.NET MVC 中为具有一对多关系的数据库播种

最小的 Web API 和播种内存中实体框架数据库

实体框架代码首先迁移两个不同的数据库

如何在实体框架数据库迁移中创建全文目录? [复制]