【发布时间】:2017-06-23 10:47:19
【问题描述】:
正如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可以在工具内部使用吗?
【问题讨论】:
-
您可以创建一个控制台应用程序并将种子命令添加到 dotnet 客户端,这样您就可以从命令行为您的数据库播种,这有意义吗?
-
不确定。您的意思是 dotnet 工具是控制台应用程序?能给我举个例子吗?如何访问 dotnet 工具中的上下文?
-
我的意思是您可以创建扩展 dotnet 客户端的控制台应用程序,因此您可以调用“dotnet 种子”,我也不知道您的设计,但您需要将您的数据库上下文移动到类库,以便在 web api 和控制台应用程序中重用相同的数据库上下文
-
我不确定...我认为可能有一种方法可以为 dotnet 创建自定义命令并将其注册到应用程序中,就像使用剃须刀工具等一样...
-
我完全按照您的建议做了一些不同的事情。我在一个单独的库 (.csproj) 中使用 EF6,因为我发现 EF7 还没有准备好迎接黄金时段(我的主要应用程序是 .net 核心)。我创建了一个控制台应用程序 (.csproj),它运行迁移并为我的数据库播种。在部署我的应用程序之前,我将此控制台应用程序用作构建管道的一部分。完美运行,我不必在启动时弄乱种子数据。
标签: asp.net-core entity-framework-core dotnet-cli