EF Core多个数据库相同架构

时间:2019-02-15 17:42:38

标签: c# entity-framework .net-core ef-core-2.0

使用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/ {测试或实时} / {控制器} / {操作}

然后,如果需要,用户可以在数据库之间即时交换。

我可以完成路由部分的工作,但实际上我对控制器和启动数据库部分的工作非常执着。

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

2 个答案:

答案 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仅在首次启动应用程序时运行,因此一旦应用程序运行,性能就不会降低完全没有(我说得对吗?)