为 EF Core 数据种子创建一个 dotnet 工具

Create a dotnet tool for EF Core data seed

如本 post 中所述,我在启动 ASP.NET 核心项目时播种数据库数据,如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {

  using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) {  
    var context = serviceScope.ServiceProvider.GetService<MyContext>();       
    context.Database.Migrate();
    context.EnsureSeedData();

  }

}

但同样post也建议手动播种数据,

Please note that, in general, it is recommended to apply these operations manually (rather than performing migrations and seeding automatically on startup), to avoid racing conditions when there are multiple servers, and unintentional changes.

我更喜欢使用 dotnet 工具,如下所示:

dotnet seed -c <Context> -s <SeedData>

其中:
- Context 是要使用的 DbContext。如果指定 none,则使用默认值。
- SeedData 是一个包含数据插入逻辑的 class。

是否可以创建这样的自定义 dotnet 工具?

工具内部可以使用DbContext吗?

创建加载项目程序集的 general-purpose dotnet CLI 工具并非易事。

您可以开始在 aspnet/EntityFramework.Tools and aspnet/EntityFramework 存储库中挖掘。大体流程为:

  1. dotnet 呼叫 dotnet-ef.dll
  2. dotnet-ef 通过 MSBuild 收集有关项目的信息(例如目标框架和运行时体系结构)并调用 ef.exe(或 dotnet ef.dll
  3. ef.exe 加载 Microsoft.EntityFrameworkCore.Design.dll 和项目程序集(在 AppDomain 中或通过反射)并调用 OperationExecutor
  4. Microsoft.EntityFrameworkCore.Design 实例化 DbContext 并对其执行操作。

您可以通过使您的工具更少 general-purpose 而更针对您的项目来显着简化这一过程。更进一步,只需制作一个控制台应用程序而不是 dotnet 工具。