在 Entity Framework Core (EF Core) 中,数据种子(Seed Data)用于在应用程序启动时向数据库表中插入一些默认数据。它通常用于为应用程序提供初始数据,或在开发和测试阶段填充数据库。EF Core 支持通过 模型构建器 来实现数据种子功能。
数据种子操作步骤
-
定义数据模型:首先,你需要确保你有一个合适的模型(例如
Product
、Category
等)。 -
使用
OnModelCreating
方法进行数据种子配置:在你的DbContext
类中重写OnModelCreating
方法,使用ModelBuilder
类来定义数据种子。 -
应用迁移:你需要确保数据库已经正确创建,并应用了迁移。
示例:如何使用 EF Core 进行数据种子
假设我们有一个 Product
和 Category
两个模型,下面的示例演示了如何进行数据种子。
1. 定义模型
public class Category
{public int CategoryId { get; set; }public string Name { get; set; }public List<Product> Products { get; set; }
}public class Product
{public int ProductId { get; set; }public string Name { get; set; }public decimal Price { get; set; }public int CategoryId { get; set; }public Category Category { get; set; }
}
2. 在 DbContext
中配置数据种子
在你的 DbContext
中,重写 OnModelCreating
方法,并使用 ModelBuilder
来添加数据种子。
public class ApplicationDbContext : DbContext
{public DbSet<Product> Products { get; set; }public DbSet<Category> Categories { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){// 种子数据:CategorymodelBuilder.Entity<Category>().HasData(new Category { CategoryId = 1, Name = "Electronics" },new Category { CategoryId = 2, Name = "Clothing" });// 种子数据:ProductmodelBuilder.Entity<Product>().HasData(new Product { ProductId = 1, Name = "Laptop", Price = 999.99m, CategoryId = 1 },new Product { ProductId = 2, Name = "Smartphone", Price = 599.99m, CategoryId = 1 },new Product { ProductId = 3, Name = "T-shirt", Price = 19.99m, CategoryId = 2 });base.OnModelCreating(modelBuilder);}
}
在这个示例中,HasData
方法用于指定默认数据。你可以看到我们为 Category
和 Product
表指定了初始数据。 CategoryId
是外键,它链接到 Product
表中的 CategoryId
字段。
3. 应用迁移
一旦你配置好数据种子,就需要创建一个新的迁移,并将其应用到数据库。
-
生成迁移:
dotnet ef migrations add SeedData
-
更新数据库:
dotnet ef database update
这时,数据库中会自动填充定义的种子数据。如果你检查数据库,你会发现 Category
和 Product
表中有了相应的初始数据。
数据种子更新和迁移
-
数据种子的更新:每次你更改了种子数据时(例如修改了数据),你需要生成新的迁移并执行数据库更新。这不会删除已有数据,而是会根据新的迁移添加或修改数据。
-
避免重复插入:EF Core 会通过迁移版本来追踪数据种子。因此,EF Core 会避免重复插入已经存在的种子数据,前提是你没有显式地修改种子数据并更新迁移。
其他常见场景
-
条件插入:EF Core 的
HasData
插入数据是一个简化的数据种子方法,它通常会在每次迁移时插入相同的数据。如果你需要根据条件进行插入,你可以通过其他方式(如在应用程序启动时检查数据是否存在)进行数据插入。 -
批量种子数据:如果种子数据较大,可以考虑从文件或其他来源加载种子数据。
总结
- EF Core 数据种子 允许在应用程序启动时或迁移时向数据库表插入初始数据。
- 使用
OnModelCreating
中的HasData
方法定义种子数据。 - 数据种子常用于填充默认数据或在开发/测试环境中初始化数据库。
EF Core 的数据种子是一个非常实用的功能,能够帮助开发人员在开发过程中更好地管理和维护数据库的初始状态。