种子数据
数据种子也可用于测试的目的,你的自动测试可以假定数据库中有一些可用的初始数据.
尽管EF Core Data Seeding系统提供了一种方法,但它非常有限,不包括生产场景. 此外它仅适用于EF Core.
ABP框架提供了种子数据系统;
- 模块化: 任何都可以无声地参与数据播种过程,而不相互了解和影响. 通过这种方式模块将种子化自己的初始数据.
- 数据库独立: 它不仅适用于 EF Core, 也使用其他数据库提供程序(如 MongoDB).
- 生产准备: 它解决了生产环境中的问题. 参见下面的On Production部分.
将数据种子化到数据库需要实现 接口.
示例: 如果没有图书,则向数据库播种一个初始图书
IDataSeedContributor
定义了SeedAsync
方法用于执行 数据种子逻辑.- 通常检查数据库是否已经存在种子数据.
- 你可以注入服务,检查数据播种所需的任何逻辑.
如果你的应用程序是, DataSeedContext
包含 TenantId
,因此你可以在插入数据或基于租户执行自定义逻辑时使用该值.
DataSeedContext
还包含用于从 传递到种子提供者的name-value配置参数.
例如Identity模块有一个种子数据贡献者,它创建一个管理角色和管理用户并分配所有权限.
IDataSeeder
是用于生成初始数据的主要服务. 使用它很容易;
你可以 IDataSeeder
并且在你需要时使用它初始化种子数据. 它内部调用 IDataSeedContributor
的实现去完成数据播种.
可以将命名的配置参数发送到 方法,如下所示:
然后种子数据提供者可以通过前面解释的 DataSeedContext
访问这些属性.
如果模块需要参数,应该在模块文档中声明它. 例如使用 AdminEmail
和 AdminPassword
参数,如果你提供了(默认使用默认值).
重要的是要了解在何处以及如何执行 IDataSeeder.SeedAsync()
.
On Production
控制台应用程序已经为你正确配置,它甚至支持多租户场景,其中每个租户拥有自己的数据库(迁移和必须的数据库).
当你将解决方案的新版本部署到服务器时,都需要运行这个DbMigrator应用程序. 它会迁移你的数据库架构(创建新的表/字段…)和播种正确运行解决方案的新版本所需的新初始数据. 然后就可以部署/启动实际的应用程序了.
即使你使用的是MongoDB或其他NoSQL数据库(不需要进行架构迁移),也建议使用DbMigrator应用程序为你的数据添加种子或执行数据迁移.
有这样一个单独的控制台应用程序有几个优点;
- 你可以在更新你的应用程序之前运行它,所以你的应用程序可以在准备就绪的数据库上运行.
- 与本身初始化种子数据相比,你的应用程序启动速度更快.
- 应用程序可以在集群环境中正确运行(其中应用程序的多个实例并发运行). 在这种情况下如果在应用程序启动时播种数据就会有冲突.
On Development
我们建议以相同的方式进行开发. 每当你(例如使用EF Core Add-Migration
命令)或更改数据种子代码(稍后说明)时,请运行DbMigrator控制台应用程序.
On Testing
你可能想为自动初始化数据种子, 这需要使用 IDataSeeder.SeedAsync()
. 在应用程序启动模板中,它在TestBase项目的YourProjectNameTestBaseModule类的方法中完成.