前言:
項目開發過程中難免會涉及到一些業務相關的基礎資料,我們稱之為種子資料,主要為了友善測試功能或者展示效果;
正常做法是手動到資料庫表建立資料,但是随着表結構更改或者資料清空後,又要重新錄入基礎資料,很是麻煩;
采用CodeFirst 通過模組化領域對象生成實體表結構的方式,為了便于種子資料的存儲和管理,一個好的解決方案顯得極為重要,Abp Vnext 項目模闆中xxx.ProjectName.DbMigrator 項目就是用于種子資料初始化到資料庫的控制台程式;
具體步驟:
1、 在xxx.Domain領域服務中的 data目錄下 建立 DefaultDataSeederContributor.cs 用于存放種子資料:
public class DefaultDataSeederContributor : IDataSeedContributor, ITransientDependency
{
public readonly IRepository<Resource,string> _resources;
public DefaultDataSeederContributor(IRepository<Resource,string> resources)
{
_resources = resources;
}
public async Task SeedAsync(DataSeedContext context)
{
//1、初始化靜态資源Resource資料
await CreateResourceDataAsync();
//2、初始化其他資料庫表資料******
}
/// <summary>
/// Resource表靜态資源初始化
/// </summary>
/// <returns></returns>
private async Task CreateResourceDataAsync()
{
//1、清空所有資料
//await _resources.DeleteAsync(p => p.Id == "CruiseType"); //删除無效 不知為何
//2、提取種子資料
var tmpDataLst = GetResourceData();
//3、循環插入資料
foreach (var item in tmpDataLst)
{
var tmpEntity = await _resources.FirstOrDefaultAsync(p => p.Id == item.Id);
if (tmpEntity != null)
{
//資料目前資料存在删除目前記錄DeleteAsync(tmpEntity);
//如果 繼承了軟删除 ISoftDelete 則需要調用 強制删除:HardDeleteAsync(tmpEntity) ;
await _resources.HardDeleteAsync(tmpEntity);
}
await _resources.InsertAsync(item);
}
}
/// <summary>
/// Resource靜态資源配置
/// </summary>
/// <returns></returns>
private List<Resource> GetResourceData()
{
List<Resource> tmpDataLst = new List<Resource>();
//1、任務資源類型:
tmpDataLst.AddRange(new List<Resource>{
new Resource() {Id="CruiseType",Name="巡檢類型"},
new Resource() {Id="CruiseType_Preset",Name="預置巡航"},
new Resource() {Id="CruiseType_Area",Name="區域巡航"}
});
return tmpDataLst;
}
}
2、xxx.ProjectName.DbMigrator 項目 xxxModule.cs 子產品類中添加種子資料類:
public class GasMonitoringDbMigratorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false);
// Remove the contributor for migrator module
context.Services.RemoveAll(t => t.ImplementationType == typeof(IDataSeedContributor));
// Add custom data seed contributor
context.Services.AddTransient<IDataSeedContributor, DefaultDataSeederContributor>();
}
}
3、啟動xxx.ProjectName.DbMigrator項目,即可将資料初始化到資料庫;
4、或者控制台管理程式 cd 到DbMigrator項目 調用 dotnet run 指令
總結:
這樣種子資料就跟着項目走了,便于管理更改和重複使用;