jk's notes
  • 种子数据

种子数据

可以理解为用于测试开发而设计的数据.

上一章中, 我们最终使用 Entity Framework Core 5 来创建了我们的数据库. 本章中, 我们会使用一些数据来填充数据库. 我们会添加一些样例 person 和 address, 然后使用州和国家设置 lookup 数据表.

填充 Lookup 数据

我们从使用州与国家数据来填充 lookup 记录开始. 首先打开 AppDbContext 类文件. 要填充数据库, 我们重写 OnModelCreating 方法, 例如:

protected void OnModelCreating(ModelBuilder modelBuilder) 
{
}

OnModfelCreating() 事件中还可以用于配置数据库架构, 它需要在添加数据之前处理. 你已经在第 4 章看过它重写后的其他用法了.

下一步是使用 ModleBuilder 实例的 Entity<T>.HasData() 方法来设置数据. 例如, 使用 Alabama 州单个 LookUp 记录来设置 LookUp 表中的数据, 可以使用下面代码:

protected void OnModelCreting(ModelBuilder modelBuilder) 
{
    modelBuilder.Entity<LookUp>().HasData(new List<LookUp>()
    {
        new LookUp() { 
            Code = "AL", 
            Description = "Alabama", 
            LookUpType = LookUpType.State 
        }
    });
}

设置数据之后, 我们需要创建迁移然后运行, 使得在数据库中完成插入, 更新, 以及删除语句. 下面我们来看看通过创建迁移来插入单个 Alabama 州的 lookup 记录. 打开 NuGet 包管理器控制台, 并运行

"Add-Migration AddStateAL"

你现在便会看到 Migrations 文件夹中新增了一个类文件, 它带有 "AddStateAL" 后缀. 生成的迁移代码看起来是这样:

using Microsoft.EntityFrameworkCore.Migrations;

namespace EFCore5WebApp.DAL.Migrations
{
    public partial class AddStateAL : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.InsertData(
                table: "LookUps",
                columns: new[] { "Code", "Description", "LookUpType" },
                values: new object[] { "AL", "Alabama", 0 });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DeleteData(
                table: "LookUps",
                keyColumn: "Code",
                keyValue: "AL");
        }
    }
}

现在, 我们在 NuGet 包管理器控制台中运行 "Update-Database" 命令, 来运行迁移. 然后, 我们开查询一下 LookUps 表, 来看看我们新加入的记录, 如图所示:

image-20220722154741503

现在, 你已经知道如何插入单条记录了. 下面我们会在 LookUps 表中插入所有的美国的州, 例如 Puerto Rico. 我们也可以将美国作为国家数据项添加到数据库中, 如下面代码:

using EFCore5WebApp.Core.Entities;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace EFCore5WebApp.DAL
{
    public class AppDbContext: DbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<LookUp>().HasData(new List<LookUp>()
            {
                new LookUp() { Code = "AL", Description = "Alabama",LookUpType = LookUpType.State},
                new LookUp() { Code = "AK", Description = "Alaska", LookUpType = LookUpType.State},
                new LookUp() { Code = "AZ", Description = "Arizona", LookUpType = LookUpType.State},
                new LookUp() { Code = "AR", Description = "Arkansas", LookUpType = LookUpType.State},
                new LookUp() { Code = "CA", Description = "California", LookUpType = LookUpType.State},
                new LookUp() { Code = "CO", Description = "Colorado", LookUpType = LookUpType.State},
                new LookUp() { Code = "CT", Description = "Connecticut", LookUpType = LookUpType.State},
                new LookUp() { Code = "DE", Description = "Delaware", LookUpType = LookUpType.State},
                new LookUp() { Code = "DC", Description = "District of Columbia",  LookUpType = LookUpType.State},
                new LookUp() { Code = "FL", Description = "Florida", LookUpType = LookUpType.State},
                new LookUp() { Code = "GA", Description = "Georgia", LookUpType = LookUpType.State},
                new LookUp() { Code = "ID", Description = "Hawaii", LookUpType = LookUpType.State},
                new LookUp() { Code = "IL", Description = "Idaho", LookUpType = LookUpType.State},
                new LookUp() { Code = "IN", Description = "Illinois", LookUpType = LookUpType.State},
                new LookUp() { Code = "IA", Description = "Indiana", LookUpType = LookUpType.State},
                new LookUp() { Code = "KS", Description = "Iowa", LookUpType = LookUpType.State},
                new LookUp() { Code = "KY", Description = "Kansas", LookUpType = LookUpType.State},
                new LookUp() { Code = "LA", Description = "Kentucky", LookUpType = LookUpType.State},
                new LookUp() { Code = "ME", Description = "Louisiana", LookUpType = LookUpType.State},
                new LookUp() { Code = "MD", Description = "Maine", LookUpType = LookUpType.State},
                new LookUp() { Code = "MA", Description = "Maryland", LookUpType = LookUpType.State},
                new LookUp() { Code = "MI", Description = "Massachusetts", LookUpType = LookUpType.State},
                new LookUp() { Code = "MN", Description = "Michigan", LookUpType = LookUpType.State},
                new LookUp() { Code = "MS", Description = "Minnesota", LookUpType = LookUpType.State},
                new LookUp() { Code = "MO", Description = "Mississippi", LookUpType = LookUpType.State},
                new LookUp() { Code = "MT", Description = "Missouri", LookUpType = LookUpType.State},
                new LookUp() { Code = "NE", Description = "Montana", LookUpType = LookUpType.State},
                new LookUp() { Code = "NV", Description = "Nevada", LookUpType = LookUpType.State},
                new LookUp() { Code = "NH", Description = "New Hampshire", LookUpType = LookUpType.State},
                new LookUp() { Code = "NJ", Description = "New Jersey", LookUpType = LookUpType.State},
                new LookUp() { Code = "NM", Description = "New Mexico", LookUpType = LookUpType.State},
                new LookUp() { Code = "NY", Description = "New York", LookUpType = LookUpType.State},
                new LookUp() { Code = "NC", Description = "New Carolina", LookUpType = LookUpType.State},
                new LookUp() { Code = "ND", Description = "North Dakota", LookUpType = LookUpType.State},
                new LookUp() { Code = "OH", Description = "Ohio", LookUpType = LookUpType.State},
                new LookUp() { Code = "OK", Description = "Oklahoma", LookUpType = LookUpType.State},
                new LookUp() { Code = "OR", Description = "Oregon", LookUpType = LookUpType.State},
                new LookUp() { Code = "PA", Description = "Pennsylvania", LookUpType = LookUpType.State},
                new LookUp() { Code = "RI", Description = "Rhode Island", LookUpType = LookUpType.State},
                new LookUp() { Code = "SC", Description = "South Carolina", LookUpType = LookUpType.State},
                new LookUp() { Code = "SD", Description = "South Dakota", LookUpType = LookUpType.State},
                new LookUp() { Code = "TN", Description = "Tennessee", LookUpType = LookUpType.State},
                new LookUp() { Code = "TX", Description = "Texas", LookUpType = LookUpType.State},
                new LookUp() { Code = "UT", Description = "Utah", LookUpType = LookUpType.State},
                new LookUp() { Code = "VT", Description = "Vermont", LookUpType = LookUpType.State},
                new LookUp() { Code = "VA", Description = "Virginia", LookUpType = LookUpType.State},
                new LookUp() { Code = "WA", Description = "Washington", LookUpType = LookUpType.State},
                new LookUp() { Code = "WV", Description = "West Virginia", LookUpType = LookUpType.State},
                new LookUp() { Code = "WI", Description = "Wisconsis", LookUpType = LookUpType.State},
                new LookUp() { Code = "WY", Description = "Wyoming", LookUpType = LookUpType.State},
                new LookUp() { Code = "PR", Description = "Puerto Rico", LookUpType = LookUpType.State},
                new LookUp() { Code = "USA", Description = "United States of America",  LookUpType = LookUpType.Country}
            });
        }
        public DbSet<Person> Persons { get; set; }
        public DbSet<Address> Addresses { get; set; }
        public DbSet<LookUp> LookUps { get; set; }
        public AppDbContext() : base() { }
        public AppDbContext(DbContextOptions options) : base(options) { }
    }
}

下面我会重复创建迁移, 并运行该迁移的过程. 在 NuGet 包管理器控制台中运行 "Add-Migration AddLookUps" 来创建迁移. 然后在 NuGet 包管理器控制台中运行命令 "Update-Database" 命令来真正的插入 lookup 记录. 此时我们已经为 LookUps 添加好测试数据, 下面我们来添加 Person 和 Address.

设置测试用 Person

下面我们来添加测试用的 Person 记录. 我们会在 AppDbContext 类中的 OnModelCreating() 方法结尾处添加代码来完成该操作. 我们会添加两个 Person 记录, 一个含有一条 Address 记录, 一个含有两条 Address 记录. 看下面用于添加测试 Person 记录的代码块:

modelBuilder.Entity<Person>().HasData(new List<Person>()
{ 
    new Person() { Id = 1, FirstName = "John", LastName = "Smith", EmailAddress = "john@smith.com" },
    new Person() { Id = 2, FirstName = "Susan", LastName = "Jones", EmailAddress = "john@smith.com" }
});

下一步就是创建 person 记录的迁移. 在 NuGet 包管理器控制台中执行命令 "Add-Migration AddTestPerson". 最后执行 "Update-Database" 来将数据添加到数据库中.

设置 Address

下面我们来添加 Address 记录, 并通过 PersonId 属性来关联对应的 Person 记录.

modelBuilder.Entity<Address>().HasData(new List<Address>()
{
    new Address() { Id = 1, AddressLine1 = "123 Test St", AddressLine2 = "",
        City = "Beverly Hills", State = "CA", ZipCode = "90210", PersonId = 1, 
        Country = "USA"},
    new Address() { Id = 2, AddressLine1 = "123 Michigan Ave", AddressLine2 = "", 
        City = "Chicago", State = "IL", ZipCode = "60612", PersonId = 2, 
        Country = "USA"},
    new Address() { Id = 3, AddressLine1 = "100 1St St", AddressLine2 = "",
        City = "Chicago", State = "IL", ZipCode = "60612", PersonId = 2, 
        Country = "USA"}
}); 

下一步就是创建 person 记录的迁移. 在 NuGet 包管理器控制台中执行命令 "Add-Migration AddTestAddress". 最后执行 "Update-Database" 来将数据添加到数据库中.

小结

本章中, 我们介绍通过设置州与国家来添加测试用 lookup 记录, 以及 person 和 address 也是一样. 设置测试数据, 首先, 在我们的应用程序数据库上下文类的 OnModelCreating 方法中添加测试数据. 然后, 我们为每一个实体创建迁移, 然后依次运行迁移. 你也可以随你自己创建单个迁移来添加你需要的所有的数据. 我们使用分开的迁移, 是为了将关注点落实在每一个实体上. 下一章里, 我们会详细地介绍如何查询数据.

Last Updated:
Contributors: jk