使用EF Core .net 2.2。
试着有一个应用程序,其中有一个“实时”数据库和一个支持我的应用程序的“测试”数据库。目前我发布了多个站点,每个站点都有自己的DBContexts,并且在发布之前我注释掉并在我的startup.cs中交换连接字符串/ db的代码。
例如:
//services.AddDbContext<DataContext>(options =>
// options.UseSqlServer(Configuration.GetConnectionString("TestDataContext")));
services.AddDbContext<DataContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("LiveDataContext")));
然后我的两个网站是
testdata.site.com和livedata.site.com
这有效,但每当对站点/控制器/视图等进行更新时,这都是耗时且低效的。另外,如果我想要两个以上的站点共享相同的数据库模式,则所需的发布工作将更加复杂。
这是我理想的解决方案,但我不知道如何实现它:
我想将路由数据发送到控制器,并让控制器在执行控制器的这一部分时决定连接字符串:
private readonly POSContext _context;
public CashierController(POSContext context)
{
_context = context;
}
例如,URL将是这样的:
www.site.com/{test或live} / {controller} / {action}
然后,如果需要,用户可以在运行中交换数据库。
我可以通过路由部分工作,但我真的坚持使用控制器和启动数据库部分来完成这项工作。
任何人都有想法或者可以让我走上正确的道路?
这完全取决于您如何发布应用程序以及您在托管服务器上的控制级别。您可以使用具有不同连接字符串值的多个配置文件,因此您应该只有一个,例如“MyAppConnectionString”,而不是具有两个连接字符串名称,并使用基于环境的配置文件在需要时覆盖它。要阅读有关配置的更多信息,请访问:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2
或者,您可以使用托管环境功能:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2
请在这个答案中找到一些有用的信息:Automatically set appsettings.json for dev and release environments in asp.net core?
这就是我最终做的事情。我查看了@Norcino上面所说的内容并在帖子中引用了这些链接。
我创建了多个Appsettings {DBIdentifier} .json文件(仍保留了通常的appsettings.json文件),ex appsettingsste3.json,在这些JSON文件中我放了一个连接字符串,所有字符串都有相同的DB名称,但指向不同的DB在我的SQL服务器上。
例如:
{
"ConnectionStrings": {
"SiteDBContext":\\Connection string for unique DB, all with same schema/tables, etc\\
}
}
在我的program.cs中,我创建了一个查看我的Web服务器上当前目录的函数,因为每个站点都在我的web服务器上的自己的文件夹中(例如:d:\ inetpub \ wwwsites \ ste1,d:\ inetpub \ wwwsites \ ste3 ,d:\ inetpub \ wwwsites \ ste3),然后取该字符串的最后四个字符,然后在添加额外的json文件时运行switch语句。
我修改的program.cs部分如下所示:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var dirStr = Directory.GetCurrentDirectory().ToString(); //Gets path of directory into string
var lastFour = dirStr.Substring(dirStr.Length - 4); //gets name of directory (last four characters in path)
switch (lastFour)
{
case "ste1":
case "ste2":
case "ste3":
string appStr = "appsettings" + lastFour.Substring(3) + ".json";
config.AddJsonFile(appStr, optional: false);
break;
}
})
.UseStartup<Startup>()
.Build();
当然,Startup.cs中的ConfigureServices需要这样:
services.AddDbContext<DataContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SiteDBContext")));
尚未进行硬测试以了解性能会是什么样,但我认为它应该没问题,因为program.cs仅在应用程序首次启动时运行,因此一旦应用程序运行,应该不会有任何性能下降。 (我对吗?)