从ASP.NET Core 2.0中的json文件进行db播种的适当位置是什么?

时间:2018-02-09 03:53:10

标签: c# asp.net-core .net-core asp.net-core-2.0

在我的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)Cor​​e等产品功能所需   迁移工作。
  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进行数据库播种更熟悉或有经验的人?

1 个答案:

答案 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