【无私分享:ASP.NET CORE 项目实战(第十二章)】添加对SqlServer、MySql、Oracle的支持

 

目录索引 

 

【无私分享:ASP.NET CORE 项目实战】目录索引html

 

简介

 

  

  增长对多数据库的支持,并非意味着同时对多种数据库操做,固然,后面,咱们会尝试同时对多种数据库操做,这可能须要多个上下文,暂且不论。分布式数据库,咱们采用的是阿里云的Mycat,这个后面会更新出来。咱们今天的场景是:咱们的项目多是在windows上开发的使用的是SqlServer,咱们要发布到linux上,SqlServer 2017 听说是支持liunx的,可是还没出... 固然不是说 SqlServer 就不能装在liunx上,可是咱们的Liunx服务器可能已经安装了MySql或 Oracle,咱们但愿使用现有的,又或者是,咱们须要切换数据库。那么,咱们须要能够随时切换数据库的支持。mysql

  

 

添加NuGet包,注册服务

 

   使用SqlServer数据库,这个官方有详细的步骤和解释,能够参考:https://docs.efproject.net/en/latest/providers/sql-server/index.html ,咱们简单介绍一下linux

  在 【(第四章)】Code First 建立数据库和数据表 中,咱们使用的就是SqlServer,咱们新建了一个数据上下文 ApplicationDbContext sql

  而后在 Startup.cs 的 ConfigureServices(IServiceCollection services) 中,咱们做为一个服务注册了上下文对象:数据库

 

    services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection")));json

  

  在使用 UseSqlServer() 的时候,咱们在 project.json 中添加了依赖包:Microsoft.EntityFrameworkCore.SqlServerwindows

   

  那么,如何添加对Mysql的支持呢,在2016年8月24日,Mysql 官方出了初版对 EntityFrameworkCore 支持的依赖包 (MySql.Data.EntityFrameworkCore 7.0.4-IR-191),这个我第一时间就尝试过,有少量问题,由于刚出,资料很是少,也几乎没多少用过的,也多是有Bug,也多是我自身的缘由,无论什么缘由,我仍是一直用 官方没出以前的 第三方的依赖,今天,咱们就是用 这个 依赖包做为演示,固然,你们可使用官方的,对于使用,由于咱们使用的是EF,因此在操做上没什么太大的区别,也能够随时切换。服务器

 

  首先,咱们引入这个包 Pomelo.EntityFrameworkCore.MySql,NuGet:Install-Package Pomelo.EntityFrameworkCore.MySqloracle

 

  使用很是简单,跟上面的 SqlServer 同样,咱们注册上下文(Startup.cs):app

  services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(Configuration.GetConnectionString("MySqlConnection")));

 

  对了,就是把 UseSqlServer()改为 UseMySql()

 

  Oracle的官方也没出,也没发现很好的第三方,咱们这里就先不介绍了,等养肥了。

 

 

修改配置文件,实现切换

 

   咱们上面实现了 EntityFrameworkCore 对两种数据库的支持,那么,咱们总不能每次切换数据库都要 修改 Startup.cs 再编译生成吧,咱们应该作一个相似开关之类的,能够实现发布完成的项目的数据库的切换。

  这里,我用的是配置文件。

  咱们在 【(第八章)】读取配置文件(二) 读取自定义配置文件 中介绍了,如何使用自定义配置文件 siteconfig.json

 

  而且咱们写了一个读取自定义配置文件的方法 GetAppSettings<T>(string key),这个方法,我稍微作了修改,增长了一个参数,能够读取任意的自定义配置文件,同时增长了对集合的读取(MyCat分布式数据库的时候读取节点会用到),这里把修改后的给你们贴一下:

  

  public class AppConfigurtaionServices
  {
    /// <summary>
    /// 获取自定义配置文件配置
    /// </summary>
    /// <typeparam name="T">配置模型</typeparam>
    /// <param name="key">根节点</param>
    /// <param name="configPath">配置文件名称</param>
    /// <returns></returns>
    public T GetAppSettings<T>(string key,string configPath= "siteconfig.json") where T:class,new()
    {
      IConfiguration config = new ConfigurationBuilder()
                  .Add(new JsonConfigurationSource { Path= configPath, ReloadOnChange=true })
                  .Build();

      var appconfig= new ServiceCollection()
                .AddOptions()
                .Configure<T>(config.GetSection(key))
                .BuildServiceProvider()
                .GetService<IOptions<T>>()
                .Value;

      return appconfig;
    }
    /// <summary>
    /// 获取自定义配置文件配置(异步方式)
    /// </summary>
    /// <typeparam name="T">配置模型</typeparam>
    /// <param name="key">根节点</param>
    /// <param name="configPath">配置文件名称</param>
    /// <returns></returns>
    public async Task<T> GetAppSettingsAsync<T>(string key, string configPath = "siteconfig.json") where T : class, new()
    {
      IConfiguration config = new ConfigurationBuilder()
                    .Add(new JsonConfigurationSource { Path = configPath, ReloadOnChange = true })
                    .Build();

      var appconfig = new ServiceCollection()
                .AddOptions()
                .Configure<T>(config.GetSection(key))
                .BuildServiceProvider()
                .GetService<IOptions<T>>()
                .Value;

      return await Task.Run(() => appconfig);
    }

    /// <summary>
    /// 获取自定义配置文件配置
    /// </summary>
    /// <typeparam name="T">配置模型</typeparam>
    /// <param name="key">根节点</param>
    /// <param name="configPath">配置文件名称</param>
    /// <returns></returns>
    public List<T> GetListAppSettings<T>(string key, string configPath = "siteconfig.json") where T : class, new()
    {
      IConfiguration config = new ConfigurationBuilder()
                    .Add(new JsonConfigurationSource { Path = configPath, ReloadOnChange = true })
                    .Build();

      var appconfig = new ServiceCollection()
                 .AddOptions()
                 .Configure<List<T>>(config.GetSection(key))
                 .BuildServiceProvider()
                 .GetService<IOptions<List<T>>>()
                 .Value;

      return appconfig;
    }
    /// <summary>
    /// 获取自定义配置文件配置(异步方式)
    /// </summary>
    /// <typeparam name="T">配置模型</typeparam>
    /// <param name="key">根节点</param>
    /// <param name="configPath">配置文件名称</param>
    /// <returns></returns>
    public async Task<List<T>> GetListAppSettingsAsync<T>(string key, string configPath = "siteconfig.json") where T : class, new()
    {
      IConfiguration config = new ConfigurationBuilder()
                    .Add(new JsonConfigurationSource { Path = configPath, ReloadOnChange = true })
                    .Build();

      var appconfig = new ServiceCollection()
                  .AddOptions()
                  .Configure<List<T>>(config.GetSection(key))
                  .BuildServiceProvider()
                  .GetService<IOptions<List<T>>>()
                  .Value;

      return await Task.Run(() => appconfig);
    }
  }

 

  咱们修改一下咱们的配置文件siteconfig.json :添加一个数据库选择的配置

  

  

  咱们在平台检测类(没有的也能够本身新建一个)中,增长一个类用于检测数据库配置:internal class DataBaseProvider { }

  

  

  咱们经过咱们上面的读取配置文件的方法 读取 咱们的配置:

  private ApplicationConfiguration dataBaserProvider = new Services.ConfigServices.AppConfigurtaionServices().GetAppSettings<ApplicationConfiguration>("siteconfig");

   

 

  读取数据库类型:

 

  public bool _isSqlServer
  {
    get
      {
        return dataBaserProvider.DataBase.ToLower() == "mssql";
      }

  }

 

  public bool _isMySql
  {
    get
      {
        return dataBaserProvider.DataBase.ToLower() == "mysql";
      }
  }

 

  public bool _isOracle
  {
    get
      {
        return dataBaserProvider.DataBase.ToLower() == "oracle";
      }
  }

 

 

  好了,咱们回到咱们的 Startup.cs

  首先,咱们实例化一下咱们这个类:

  

 

  修改 ConfigureServices(IServiceCollection services) 方法的 上下文注册服务:

  

 

  OK,这样咱们就很简陋的实现了切换,咱们来测试一下:

  首先使用SqlServer:siteconfig.json : "DataBase": "MSSQL"

  dotnet ef database update

  

 

  使用MySql:siteconfig.json : "DataBase": "MYSQL"

  dotnet ef database update

  

 

  好了,到这里就结束了,虽然简陋,给你们提供一下思路。

 

 

 

 

 

 

 

 

 

 

 

但愿跟你们一块儿学习Asp.net Core 

刚开始接触,水平有限,不少东西都是本身的理解和翻阅网上大神的资料,若是有不对的地方和不理解的地方,但愿你们指正!

虽然Asp.net Core 如今很火热,可是网上的不少资料都是前篇一概的复制,因此有不少问题我也暂时没有解决,但愿你们能共同帮助一下!

 

原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

相关文章
相关标签/搜索