【Abp VNext】實戰入門(十三):自定義專案所需種子資料
阿新 • • 發佈:2021-02-09
技術標籤:ABP.net coreabp vnextc#種子資料初始化
前言:
專案開發過程中難免會涉及到一些業務相關的基礎資料,我們稱之為種子資料,主要為了方便測試功能或者展示效果;
常規做法是手動到資料庫表建立資料,但是隨著表結構更改或者資料清空後,又要重新錄入基礎資料,很是麻煩;
採用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 tmpData = _resources.FirstOrDefault(p => p.Id == item.Id);
if (tmpData == null)
{
await _resources.InsertAsync(item, true);
}
else
{
//由於刪除方法無效 故而採用更新的方式
tmpData.Name = item.Name;
tmpData.Desc = item.Desc;
await _resources.UpdateAsync(tmpData);
}
}
}
/// <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專案,即可將資料初始化到資料庫;
總結:
這樣種子資料就跟著專案走了,便於管理更改和重複使用;
但是在種子數類中想通過 _tablerepository.deleteasync() 的方式無法刪除資料 不知道為何
目前是某張表對應的種子資料有變化,就手動開啟資料表清空資料,然後在執行種子資料生成專案xxx.ProjectName.DbMigrator 。