Asp.net core 为EF核心数据种子创建dotnet工具
如本文所述,我正在启动ASP.NET核心项目时播种数据库数据,如下所示: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
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),它运行迁移并为我的数据库种子。在部署应用程序之前,我将此控制台应用程序用作构建管道的一部分。工作完美,我不必在启动时弄乱种子数据。