播种大量数据(EF核心)

时间:2020-07-06 08:09:59

标签: c# sql sql-server entity-framework

这是我在创建数据库后手动使用的脚本,以生成无用的数据进行测试:

DECLARE @index BIGINT

SET @index = 0
SET IDENTITY_INSERT Persons ON

WHILE @index < 50000
BEGIN   
    INSERT INTO Persons
        (Id, [Name], Code)
    VALUES
        (NEWID(), CONCAT('Person', @index), @index)

    SET @index = @index + 1
END

如何在数据库初始化时使用EF内核运行它,或者以某种方式使用数据播种方法运行它?周围所有的答案都是关于少量数据的,但就我而言,我处理的是约50000条记录。

1 个答案:

答案 0 :(得分:0)

如果您使用的是EF Core 2.1和更高版本,则使用HasData方法是添加种子数据的理想方法。

我们可以使用'OnModelCreating'方法中的ModelBuilder对象来调用它,以将数据添加为代码首次迁移的一部分。然后在数据库被脚手架或初始化并应用迁移时的第一次数据播种。

您还可以将其与Bogus结合使用以为实体生成虚假数据。

内联是一种用于创建上述问题的50000个对象的方案。程序成功执行,没有任何问题。实际上,ef core具有足够的智能,可以将数据分为每批700-800个对象的批查询并将其推送到数据库。

实体:

public class Person
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    int id = 1;
    var fakePersons = new Faker<Person>().StrictMode(true)
        .RuleFor(o => o.Id, f => id++)
        .RuleFor(u => u.FirstName, (f, u) => f.Name.FirstName())
        .RuleFor(u => u.LastName, (f, u) => f.Name.LastName());

    var persons = fakePersons.Generate(50000);

    modelBuilder.Entity<Person>().HasData(persons);
}