正如本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吗?
答案 0 :(得分:3)
创建一个加载项目程序集的通用dotnet
CLI工具并非易事。
您可以在aspnet/EntityFramework.Tools和aspnet/EntityFramework回购中开始挖掘。一般流程如下:
dotnet
来电dotnet-ef.dll
dotnet-ef
通过MSBuild收集有关项目的信息(例如目标框架和运行时架构)并调用ef.exe
(或dotnet ef.dll
)ef.exe
加载Microsoft.EntityFrameworkCore.Design.dll
和项目大会(在AppDomain
或通过反思)并调用OperationExecutor
Microsoft.EntityFrameworkCore.Design
实例化DbContext
并对其执行操作。通过使您的工具不那么通用且更具体到您的项目,您可以大大简化这一过程。甚至只需制作一个控制台应用程序而不是dotnet
工具。