在启用自动生成主键的情况下,如何在DbContext的“ OnModelCreating”方法期间播种主数据?

时间:2018-11-24 16:15:29

标签: c# sql-server entity-framework asp.net-core database-migration

应用程序框架:ASPNET Core 2.1

这是我的课程

public class Employee
{
    [DataMember(Name = "key")]
    [Key]
    public Guid Key { get; set; }
    [Required]
    [DataMember(Name = "Name")]
    public string Name { get; set; }
}

我有下面的代码,它们可以为数据植入种子并自动生成Guid

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Auto generation of Guid
        modelBuilder.Entity<Employee>().Property(x => x.Key).HasDefaultValueSql("NEWID()");

        //seeding of data
        modelBuilder.Entity<Employee>().HasData(
            new Employee{ Name = "Hamlet" },
            new Employee{ Name = "King Lear" },
            new Employee{ Name = "Othello" }
        );
    }

运行add-migration InitialCreate命令时出现以下错误

  

无法添加实体类型“雇员”的种子实体,因为没有为必需的属性“键”提供值。

我不想发送Key的值。我希望它可以在SQL Server数据库中自动生成。

我的基本要求是:每当我在包管理器控制台中运行update-database时,都插入主数据(已更新)。

1 个答案:

答案 0 :(得分:1)

尝试将以下属性添加到Key属性:。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

这将指示数据库在未指定Key的情况下自动生成context.Database.Migrate()

更新

Apparently,即使对于为迁移中的种子数据自动生成的ID,也必须始终为其指定ID,因为如果给定条目已存在于数据库中,则该ID将用于匹配。

但是,一种解决方案是在初始化数据库后(例如,在调用select t.* from (select distinct table.users from table) t where not exists ( select to_char(u.transaction_date, 'YYYY-MM') as month from table u where u.users = t.users group by month having sum(u.amount) <= 10 ) 之后)在数据库中手动插入所需的记录。当然,这里您必须手动检查给定记录是否还没有。