为EF Core数据种子

时间:2017-02-06 13:14:46

标签: asp.net-core entity-framework-core dotnet-cli

正如本post中所述,我在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吗?

1 个答案:

答案 0 :(得分:3)

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

您可以在aspnet/EntityFramework.Toolsaspnet/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并对其执行操作。
  5. 通过使您的工具不那么通用且更具体到您的项目,您可以大大简化这一过程。甚至只需制作一个控制台应用程序而不是dotnet工具。