使用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/ {测试或实时} / {控制器} / {操作}
然后,如果需要,用户可以在数据库之间即时交换。
我可以完成路由部分的工作,但实际上我对控制器和启动数据库部分的工作非常执着。
任何人都有想法或可以让我走上正确的路吗?
答案 0 :(得分:1)
这一切都取决于您如何发布应用程序以及对托管服务器的控制级别。 您可以使用具有不同连接字符串值的多个配置文件,因此,只有两个(而不是两个)连接字符串名称,而应该只有一个,例如“ 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?
答案 1 :(得分:0)
这就是我最终要做的。我查看了@Norcino上面所说的内容,并引用了他帖子中的链接。
我创建了多个Appsettings {DBIdentifier} .json文件(也仍然保留了常用的appsettings.json文件),ex appsettingsste3.json,并在这些JSON文件中放置了一个连接字符串,它们都具有相同的数据库名称,但是指向到我的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仅在首次启动应用程序时运行,因此一旦应用程序运行,性能就不会降低完全没有(我说得对吗?)