在我的Core 1.0应用程序中,Startup ctor将几个额外的json文件加载到配置中......
public Startup(IHostingEnvironment env) {
Environment = env;
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json")
.AddJsonFile($"activityGroups.{env.EnvironmentName}.json")
.AddEnvironmentVariables();
Configuration = builder.Build();
}
然后在ConfigureServices中,我将配置中的数据从配置中抓取到强类型列表中......
public void ConfigureServices(IServiceCollection services) {
services.AddDbContext<Models.DbContext>(
options => options.UseSqlServer(
Configuration["Data:DefaultConnection:ConnectionString"]
)
);
services.AddScoped<Repository>();
services.AddTransient<DbSeed>();
services.AddOptions();
services.Configure<List<Models.Task>>(Configuration.GetSection("ActivityGroups"));
}
然后,在Configure中,注入强类型列表并用于db init ..
public void Configure(
IApplicationBuilder app,
DbSeed seed,
ILoggerFactory logging,
IOptions<List<ActivityGroup>> activityGroupConfig
) {
app.UseAuthentication();
app.UseMvc();
bool seedDb;
bool.TryParse(Configuration.GetSection("SeedDb").Value, out seedDb);
if (seedDb) {
seed.EnsureSeeded(activityGroupConfig.Value);
}
}
...然而
在2.0项目中,将SeedData.Initialize调用移动到Main方法 of Program.cs ......
从2.0开始,在BuildWebHost中执行任何操作都是不好的做法,除非 构建和配置Web主机。 [配置Web主机包括数据种子?]任何有关运行该主机的内容 应该在BuildWebHost之外处理应用程序 - 通常在 Program.cs的主要方法。
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#move-database-initialization-code
然而,在&#34; new&#34; Main(string[] args)
我们无法访问dbcontext(直到Startup.ConfigureServices
)。即使在MS文档中的上述SeedData.Initialize(services);
调用中,SeedData如何访问配置服务中稍后才定义的连接字符串?
强烈建议采用这种新的2.0模式 实体框架(EF)Core等产品功能所需 迁移工作。
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#update-main-method-in-programcs
我一直在谷歌搜索和挖掘文档和samples(这个例子种子与硬编码值)没有得到预期或推荐设计的清晰图片(超越,&#34;不要做你以前做过的事情&#34;。)
在这里,对于如何从ASP.NET Core 2.0中的磁盘上的json进行数据库播种更熟悉或有经验的人?
答案 0 :(得分:1)
所以,在this SO question的帮助下,我得到了从Program.cs中获取服务的要点
public class Program {
public static void Main(string[] args) {
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var logger = services.GetRequiredService<ILoggerFactory>();
var ctx = services.GetRequiredService<DataContext>();
// Now I can access the DbContext, create Repository, SeedData, etc!
现在,问题在于试图找出如何从appsettings.json访问值,新的SO问题here。