天天看點

【Abp VNext】實戰入門(九):DbMigrator 自定義項目所需種子資料

前言:

項目開發過程中難免會涉及到一些業務相關的基礎資料,我們稱之為種子資料,主要為了友善測試功能或者展示效果;

正常做法是手動到資料庫表建立資料,但是随着表結構更改或者資料清空後,又要重新錄入基礎資料,很是麻煩;

采用CodeFirst 通過模組化領域對象生成實體表結構的方式,為了便于種子資料的存儲和管理,一個好的解決方案顯得極為重要,Abp Vnext 項目模闆中xxx.ProjectName.DbMigrator 項目就是用于種子資料初始化到資料庫的控制台程式;

具體步驟:

1、 在xxx.Domain領域服務中的 data目錄下 建立 DefaultDataSeederContributor.cs 用于存放種子資料:

【Abp VNext】實戰入門(九):DbMigrator 自定義項目所需種子資料
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 指令

總結:

這樣種子資料就跟着項目走了,便于管理更改和重複使用;