繁体   English   中英

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

[英]How do I seed the master data during "OnModelCreating" method of DbContext in case of auto generated primary key enabled?

应用程序框架: ASPNET Core 2.1

这是我的 class

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 服务器数据库中自动生成。

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

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

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

如果未指定,则将指示数据库自动生成Key

更新

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

但是,一种解决方案是在初始化数据库后(例如,在调用context.Database.Migrate()之后context.Database.Migrate()将所需的记录手动插入数据库中。 当然,在这里您必须手动检查给定记录是否还不存在。

尝试在播种期间手动添加标识值:


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{ Key = Guid.NewGuid(), Name = "Hamlet" },
            new Employee{ Key = Guid.NewGuid(), Name = "King Lear" },
            new Employee{ Key = Guid.NewGuid(), Name = "Othello" }
        );
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM