Asp.net core 为EF核心数据种子创建dotnet工具

Asp.net core 为EF核心数据种子创建dotnet工具,asp.net-core,entity-framework-core,dotnet-cli,Asp.net Core,Entity Framework Core,Dotnet Cli,如本文所述,我正在启动ASP.NET核心项目时播种数据库数据,如下所示: public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateS

如本文所述,我正在启动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();

  }

}
dotnet seed -c <Context> -s <SeedData>
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂){
使用(var serviceScope=app.ApplicationServices.GetRequiredService().CreateScope()){
var context=serviceScope.ServiceProvider.GetService();
Migrate();
context.ensureseddata();
}
}
但同一篇文章也建议手动播种数据

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

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

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 seed -c <Context> -s <SeedData>
dotnetseed-c-s
其中:
-Context是要使用的DbContext。如果未指定,则使用默认值。
-SeedData是包含数据插入逻辑的类

有可能创建这样一个自定义的dotnet工具吗


DbContext可以在工具中使用吗?

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

你可以开始在市场和回购协议中四处挖掘。一般工艺流程为:

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

  • 您可以通过减少工具的通用性,使其更适合您的项目,从而大大简化这一过程。甚至更进一步,只需制作一个控制台应用程序而不是一个
    dotnet
    工具。

    您可以创建一个控制台应用程序并将seed命令添加到dotnet客户端,这样您就可以从命令行为数据库添加种子,这是有意义的吗?不确定。你是说dotnet工具是一个控制台应用程序?你能举个例子吗?如何访问dotnet工具中的上下文?我的意思是,您可以创建扩展dotnet客户端的控制台应用程序,以便调用“dotnet种子”,另外,我不知道您的设计,但您需要将db上下文移动到类库中,以便在web api和控制台应用程序中重用相同的db上下文我不确定。。。我认为可能有一种方法可以为dotnet创建一个自定义命令,并在应用程序中注册它,就像使用razor工具一样……我完全按照您的建议做了,但有一些不同之处。我在一个单独的库(.csproj)中使用EF6,因为我发现EF7还没有准备好进入黄金时段(我的主要应用程序是.NETCore)。我创建了一个控制台应用程序(.csproj),它运行迁移并为我的数据库种子。在部署应用程序之前,我将此控制台应用程序用作构建管道的一部分。工作完美,我不必在启动时弄乱种子数据。