目录索引 

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

简介

  

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

  

添加NuGet包,注册服务

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

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

  然后在 Startup.cs 的 ConfigureServices(IServiceCollection services) 中,我们作为一个服务注册了上下文对象:

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

  

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

  

  那么,如何添加对Mysql的支持呢,在2016年8月24日,Mysql 官方出了第一版对 EntityFrameworkCore 支持的依赖包 (MySql.Data.EntityFrameworkCore 7.0.4-IR-191),这个我第一时间就尝试过,有少许问题,因为刚出,资料非常少,也几乎没多少用过的,也可能是有Bug,也可能是我自身的原因,不管什么原因,我还是一直用 官方没出之前的 第三方的依赖,今天,我们就是用 这个 依赖包作为演示,当然,大家可以使用官方的,对于使用,因为我们使用的是EF,所以在操作上没什么太大的区别,也可以随时切换。

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

  使用非常简单,跟上面的 SqlServer 一样,我们注册上下文(Startup.cs):

  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

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

  1. 【无私分享:ASP.NET CORE 项目实战(第十三章)】Asp.net Core 使用MyCat分布式数据库,实现读写分离

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我 ...

  2. 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...

  3. 【无私分享:ASP.NET CORE 项目实战(第七章)】文件操作 FileHelper

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在程序设计中,我们很多情况下,会用到对文件的操作,在 上一个系列 中,我们有很多文件基本操作的示例,在Core中有一些改变,主 ...

  4. 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们之前的Asp.net mvc 开发中,一提到配置文件,我们不由的想到 web.config 和 app.config,在 ...

  5. 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfW ...

  6. 【无私分享:ASP.NET CORE 项目实战(第四章)】Code First 创建数据库和数据表

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来介绍下Asp.net Core 使用 CodeFirst 创建数据库和表,通过 控制台 和 dotnet ef 两种 ...

  7. 【无私分享:ASP.NET CORE 项目实战(第三章)】EntityFramework下领域驱动设计的应用

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们 [无私分享:从入门到精通ASP.NET MVC] 系列中,我们其实也是有DDD思想的,但是没有完全的去实现,因为并不是 ...

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

    简介 首先,我们的  [无私分享:从入门到精通ASP.NET MVC]   系列已经接近尾声,希望大家在这个过程中学到了一些思路和方法,而不仅仅是源码. 因为是第一次写博客,我感觉还是比较混乱的,其中 ...

  9. 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...

随机推荐

  1. iOS逆向工程之Hopper中的ARM指令

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...

  2. Autofac - 方法注入

    方法注入, 其实就是在注册类的时候, 把这个方法也注册进去. 那么在生成实例的时候, 会自动调用这个方法. 其实现的方法, 有两种. 准备工作: public interface IAnimal { ...

  3. WPF中Grid实现网格,表格样式通用类

    /// <summary> /// 给Grid添加边框线 /// </summary> /// <param name="grid"></ ...

  4. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  5. 【Linux大系】Linux的概念与体系

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...

  6. Atitit.软件研发团队建设原理与概论 理论

    Atitit.软件研发团队建设原理与概论 理论 培训 团队文化建设(内刊,ppt,书籍,杂志等) 梯队建设 技术储备人才的问题 团队建设--小红花评比. 团队建设--文化墙.doc 户外拓展 1. 团 ...

  7. 通过Mono 在 Heroku 上运行 .NET 应用

    英文原文:Running .NET on Heroku 中文原文:在 Heroku 上运行 .NET 应用 自从加入了Heroku之后,我就想在这个平台上运行.NET程序.现在我很高兴向大家宣布,我们 ...

  8. .Net Core 系列:1、环境搭建

    前言: 2016年6月28日微软宣布发布 .NET Core 1.0.ASP.NET Core 1.0 和 Entity Framework Core 1.0. .NET Core是微软在两年前发起的 ...

  9. U3D DrawCall优化手记

    在最近,使用U3D开发的游戏核心部分功能即将完成,中间由于各种历史原因,导致项目存在比较大的问题,这些问题在最后,恐怕只能通过一次彻底的重构来解决 现在的游戏跑起来会有接近130-170个左右的Dra ...

  10. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...