【发布时间】: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