Entity Framework Core 种子数据(Data Seeding)可以帮助开发者在应用程序中使用预定义的数据填充数据库。本篇文章将从概览、设计、实现等方面详细地介绍 Entity Framework Core 种子数据的完整攻略,包括,如何配置数据模型和 DbContext,如何添加种子数据,以及如何在应用启动时自动应用种子数据等。
1. 概述
Entity Framework Core 是一个轻量级、扩展、跨平台的 ORM(对象关系映射)框架,它支持从各种数据库引擎中存储和检索数据,例如 SQL Server、MySQL 和 SQLite。在 Entity Framework Core 中,种子数据是指使用代码的方式在数据库中预设数据,这些数据可以用于开发、测试或者演示。
2. 设计
Entity Framework Core 种子数据包括以下三个方面的设计:
数据模型设计
数据模型设计是指定义哪些实体和属性将成为数据表和数据库列。数据模型设计可以由 Entity Framework Core 的模型构建器、手工代码或者组合模型构建器和手工代码完成。
数据库上下文设计
数据库上下文是一个类,它维护和管理 Entity Framework Core 的数据库访问方式。数据库上下文中包含一个或多个 DbSet,其中每个 DbSet 表示数据库中的一个数据表。
在数据库上下文中配置种子数据的方法是在 DbContext 中,重写 OnModelCreating 方法,并使用 modelBuilder.Entity
种子数据设计
种子数据是预先填充数据库表的一组数据。为了添加种子数据,必须创建一个对象的列表或数组。每个对象代表一个行,并且包含与该行关联的属性。可以针对每个实体创建种子数据,并将它们保存在数组中,然后使用 HasData 方法添加数据。
3. 实现
本节将详细说明如何配置数据模型和 DbContext、如何添加种子数据,以及如何在应用启动时自动应用种子数据。
配置数据模型和 DbContext
下面是一个简单的数据模型定义。其中 Employee
和 Department
表表示公司中雇员和部门的信息。
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public Department Department { get; set; }
public int DepartmentId { get; set; }
}
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
public ICollection<Employee> Employees { get; set; }
}
public class SampleDbContext : DbContext
{
public SampleDbContext(DbContextOptions<SampleDbContext> options) : base(options)
{
}
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Department>().HasData(
new Department { DepartmentId = 1, Name = "IT" },
new Department { DepartmentId = 2, Name = "Sales" },
new Department { DepartmentId = 3, Name = "Marketing" }
);
modelBuilder.Entity<Employee>().HasData(
new Employee { EmployeeId = 1, Name = "John Doe", DepartmentId = 1 },
new Employee { EmployeeId = 2, Name = "Jane Doe", DepartmentId = 2 },
new Employee { EmployeeId = 3, Name = "Jim Johnson", DepartmentId = 3 }
);
}
}
在上面的代码中,我们定义了两个实体类 Employee
和 Department
,并定义了一个数据库上下文 SampleDbContext
。在 SampleDbContext
中,我们重写了 OnModelCreating 方法,并使用 modelBuilder.Entity
添加种子数据
在 Entity Framework Core 中,添加种子数据有两种不同的方法:直接添加单条记录方法与通过 List 添加多条记录方法。
直接添加单条记录方法
对于单条记录,可以使用 HasData()
方法直接向数据表添加种子数据。以下是示例:
modelBuilder.Entity<Department>().HasData(
new Department { DepartmentId = 1, Name = "IT" }
);
通过 List 添加多条记录方法
对于多条记录,需要使用 List<T>
将对象添加到列表中,然后在 DbContext
中引用该列表并使用 HasData()
一次性添加多条记录。以下是示例:
var departments = new List<Department>
{
new Department { DepartmentId = 1, Name = "IT" },
new Department { DepartmentId = 2, Name = "Sales" },
new Department { DepartmentId = 3, Name = "Marketing" }
};
modelBuilder.Entity<Department>().HasData(departments);
在应用启动时自动应用种子数据
如果需要在应用启动时自动加载和应用种子数据,可以在 Program.cs
文件中重写 Main()
方法,在调用 CreateWebHostBuilder()
方法之后调用 CreateDefaultBuilder()
方法,然后使用 UseStartup<Startup>()
方法添加启动配置。使用 EnsureCreated()
方法来自动为数据库生成模式并添加种子数据。
以下是示例:
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel()
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<SampleDbContext>();
context.Database.EnsureCreated();
// Add seed data if database is empty
if (!context.Employees.Any())
{
context.Employees.AddRange(
new Employee { EmployeeId = 1, Name = "John Doe", DepartmentId = 1 },
new Employee { EmployeeId = 2, Name = "Jane Doe", DepartmentId = 2 },
new Employee { EmployeeId = 3, Name = "Jim Johnson", DepartmentId = 3 }
);
}
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database.");
}
}
host.Run();
}
在上面的代码中,我们首先使用 CreateWebHostBuilder()
方法创建了一个 WebHost
对象,然后使用 CreateDefaultBuilder()
方法并添加了一个启动配置,最后使用 EnsureCreated()
方法自动为数据库生成模式并添加种子数据。
总结
本文详细介绍了 Entity Framework Core 种子数据的完整攻略。在设计 Entity Framework Core 种子数据时,需要考虑数据模型、数据库上下文和种子数据的设计。在实现种子数据时,我们可以使用直接添加单条记录方法和通过 List 添加多条记录方法来添加种子数据。最后,我们可通过重写 Main()
方法,在应用启动时自动应用种子数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework Core种子数据Data-Seeding - Python技术站