EF Core 多数据库相同模式

EF Core multiple database same schema

使用 EF Core .net 2.2。

尝试开发一个应用程序,其中有一个 "live" 数据库和一个 "test" 数据库支持我的应用程序。目前我发布了多个站点,每个站点都有自己的 DBContexts,就在发布之前,我注释掉并交换了 startup.cs.

中连接 string/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

这可行,但每当对 site/controllers/views 等进行更新时,它既耗时又低效。另外,如果我想要两个以上的站点共享相同的数据库模式,则所需的发布工作甚至会变得复杂更多

这是我理想的解决方案,但我不知道如何实现它:

我想将路由数据发送到控制器,并让控制器在执行控制器的这一部分时决定连接字符串:

private readonly POSContext _context;

    public CashierController(POSContext context)
    {
        _context = context;
    }

例如,URL 类似于:

www.site.com/{测试或现场}/{控制器}/{操作}

然后用户可以根据需要在数据库之间即时切换。

我可以完成路由部分,但我真的不知道如何使用控制器和启动数据库部分来完成这项工作。

任何人有想法或可以让我走上正确的道路吗?

这完全取决于您发布应用程序的方式以及您对托管服务器的控制级别。 您可以使用多个具有不同连接字符串值的配置文件,因此您不应使用两个连接字符串名称,而应该只有一个,例如 "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

也请在此答案中找到一些有用的信息:

这就是我最终所做的。我查看了@Norcino 上面所说的内容并引用了他的 post.

中的链接

我创建了多个 Appsettings{DBIdentifier}.json 文件(仍然保留了通常的 appsettings.json 文件),例如 appsettingsste3.json 并且在这些 JSON 文件中我放一个连接字符串,都具有相同的数据库名称,但指向我的 SQL 服务器上的不同数据库。

例如:

 {
      "ConnectionStrings": {
          "SiteDBContext":\Connection string for unique DB, all with same schema/tables, etc\
      }
  }

在我的 program.cs 中,我创建了一个函数来查看我的网络服务器上的当前目录,因为每个站点都在我的网络服务器上它自己的文件夹中(例如 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 仅在应用程序首次启动时 运行s,因此一旦应用程序启动运行宁根本不应该有任何性能下降。 (我说的对吗?)