4

如本文所述,我在 ASP.NET Core 项目的启动中播种数据库数据,如下所示

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();

  }

}

但同一篇文章还建议手动播种数据,

请注意,一般情况下,建议手动应用这些操作(而不是在启动时自动执行迁移和播种),以避免在有多个服务器时出现争用情况和意外更改。

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

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

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

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

DbContext 可以在工具内部使用吗?

4

1 回答 1

3

dotnet创建用于加载项目程序集的通用CLI 工具并非易事。

您可以开始在aspnet/EntityFramework.Toolsaspnet/EntityFramework 存储库中进行挖掘。一般工艺流程为:

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

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

于 2017-02-09T18:45:58.397 回答