种子数据
可以理解为用于测试开发而设计的数据.
上一章中, 我们最终使用 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
表, 来看看我们新加入的记录, 如图所示:
现在, 你已经知道如何插入单条记录了. 下面我们会在 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
方法中添加测试数据. 然后, 我们为每一个实体创建迁移, 然后依次运行迁移. 你也可以随你自己创建单个迁移来添加你需要的所有的数据. 我们使用分开的迁移, 是为了将关注点落实在每一个实体上. 下一章里, 我们会详细地介绍如何查询数据.