1. 程式人生 > 其它 >【Abp VNext】實戰入門(十三):自定義專案所需種子資料

【Abp VNext】實戰入門(十三):自定義專案所需種子資料

技術標籤: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 。