【问题标题】:What is the proper place for db seeding from json files in ASP.NET Core 2.0?在 ASP.NET Core 2.0 中从 json 文件进行 db 播种的正确位置是什么?
【发布时间】:2018-02-09 03:53:09
【问题描述】:

在我的 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 方法 Program.cs 的...

从 2.0 开始,在 BuildWebHost 中执行任何操作都是不好的做法,除了 构建和配置网络主机。 [配置网络主机包括数据播种?] 任何关于运行 应用程序应该在 BuildWebHost 之外处理——通常在 Program.cs 的 Main 方法。
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#move-database-initialization-code

然而,在“新”Main(string[] args) 中,我们无法访问 dbcontext(直到Startup.ConfigureServices)。即使在 MS 文档中的上述SeedData.Initialize(services); 调用中,SeedData 将如何访问直到稍后在配置服务中才定义的连接字符串?

强烈建议采用这种新的 2.0 模式,并且是 Entity Framework (EF) Core 等产品功能所需的 迁移工作。
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#update-main-method-in-programcs

我一直在谷歌搜索和挖掘文档和samples(带有硬编码值的示例种子),但没有清楚地了解期望或推荐的设计(除此之外,“不要做你以前做过的事情”。 )

这里有没有人更熟悉或有经验如何在 ASP.NET Core 2.0 中从磁盘上的 json 进行数据库播种?

【问题讨论】:

  • 您做对了。 doco 说“不要在BuildWebHost 中执行此操作”,而您在Configure() 中执行此操作。你是从哪里得到这个DbSeed 课程的?
  • @zaitsman docs mention,“在 2.0 项目中,将 SeedData.Initialize 调用移动到 Program.cs 的 Main 方法:”我只是不确定如何。
  • 目前,执行顺序为:Program.Main()Program.BuildWebHost()Startup.ConfigureServices(),然后是Startup.Configure()。所以我想当Startup 完成时,所有服务都已配置完毕。但是Main(args) 不能识别 DI,因为Program.Main 必须有一个特定的签名......对吗?

标签: c# asp.net-core .net-core asp.net-core-2.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2021-06-12
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多