1. 程式人生 > >【無私分享:ASP.NET CORE 專案實戰(第十二章)】新增對SqlServer、MySql、Oracle的支援

【無私分享:ASP.NET CORE 專案實戰(第十二章)】新增對SqlServer、MySql、Oracle的支援

目錄索引

簡介

  增加對多資料庫的支援,並不是意味著同時對多種資料庫操作,當然,後面,我們會嘗試同時對多種資料庫操作,這可能需要多個上下文,暫且不論。分散式資料庫,我們採用的是阿里雲的Mycat,這個後面會更新出來。我們今天的場景是:我們的專案可能是在windows上開發的使用的是SqlServer,我們要釋出到linux上,SqlServer 2017 據說是支援liunx的,但是還沒出... 當然不是說 SqlServer 就不能裝在liunx上,但是我們的Liunx伺服器可能已經安裝了MySql或 Oracle,我們希望使用現有的,又或者是,我們需要切換資料庫。那麼,我們需要可以隨時切換資料庫的支援。

新增NuGet包,註冊服務

  在  中,我們使用的就是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 支援的依賴包 (),這個我第一時間就嘗試過,有少許問題,因為剛出,資料非常少,也幾乎沒多少用過的,也可能是有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 再編譯生成吧,我們應該做一個類似開關之類的,可以實現釋出完成的專案的資料庫的切換。

  這裡,我用的是配置檔案。

  並且我們寫了一個讀取自定義配置檔案的方法 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 現在很火熱,但是網上的很多資料都是前篇一律的複製,所以有很多問題我也暫時沒有解決,希望大家能共同幫助一下!

相關推薦

無私分享ASP.NET CORE 專案實戰新增SqlServerMySqlOracle支援

目錄索引 簡介   增加對多資料庫的支援,並不是意味著同時對多種資料庫操作,當然,後面,我們會嘗試同時對多種資料庫操作,這可能需要多個上下文,暫且不論。分散式資料庫,我們採用的是阿里雲的Mycat,這個後面會更新出來。我們今天的場景是:我們的專案可能是在windows上開發的使用的

無私分享ASP.NET CORE 專案實戰Asp.net Core 快取 MemoryCache 和 Redis

1 /// <summary> 2 /// 修改快取 3 /// </summary> 4 /// <param name="key">快取Key</param> 5 ///

無私分享ASP.NET CORE 專案實戰圖形驗證碼的實現

1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 該方法用於生成指定位數的隨機數 5 /// </summary> 6

無私分享ASP.NET CORE 專案實戰釋出專案到 Linux 上執行 Core 專案

目錄索引 簡介   ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執

無私分享ASP.NET CORE 專案實戰建立區域Areas,新增TagHelper

目錄索引 簡介   在Asp.net Core VS2015中,我們發現還有很多不太簡便的地方,比如右擊新增檢視,轉到試圖頁等功能圖不見了,雖然我們可以通過工具欄的自定義命令,把這兩個右擊選單新增上,但是貌似是灰色的不能用。   其實,這樣也好,通過手動建立,更讓我們深刻的理解M

無私分享ASP.NET CORE 專案實戰讀取配置檔案 appsettings.json

目錄索引 簡介   在我們之前的Asp.net mvc 開發中,一提到配置檔案,我們不由的想到 web.config 和 app.config,在 core 中,我們看到了很多的變化,新的配置系統顯得更加輕量級,具有更好的擴充套件性,並且支援多樣化的資料來源。   部落格園對於這個的

無私分享ASP.NET CORE 專案實戰讀取配置檔案 讀取自定義配置檔案

目錄索引 簡介   但隨之產生了問題:我們使用的是在 Startup.cs 中(如下圖)來實現配置讀取,有兩個問題 ① 我們如果定義N種配置,是否要再這裡新增N條這樣的配置 ; ② 如果我們的配置不想寫在appsettings.json中呢     解決問題

無私分享ASP.NET CORE 專案實戰十三Asp.net Core 使用MyCat分散式資料庫,實現讀寫分離

目錄索引 簡介   MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中

無私分享ASP.NET CORE 專案實戰Code First 建立資料庫和資料表

目錄索引 簡介   本章我們來介紹下Asp.net Core 使用 CodeFirst 建立資料庫和表,通過 控制檯 和 dotnet ef 兩種方式 修改EF上下文物件,新增測試類   我修改了一下名字,Domains 改為了 wkmvc.Data   我們新建一個

無私分享ASP.NET CORE 專案實戰檔案操作 FileHelper

目錄索引 簡介   在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自己封裝方法去實現。今天,我們就對一些基本

無私分享ASP.NET CORE 專案實戰Repository倉儲 UnitofWork

1 public abstract class Repository<T> : IRepository<T> where T : class 2 { 3 #region 資料上下文 4 5 /// <s

無私分享ASP.NET CORE 專案實戰EntityFramework下領域驅動設計的應用

這好像就是比我的多了一個“中轉層”,把我們的介面作為了一箇中轉,領域層繼承了倉儲實現業務和資料操作,這有什麼實際意義嗎?希望大家指正一下: 我不理解的是,如果是按照這樣,那麼我如果要修改註冊方法,比如我要在上面方法中傳遞 eamil,name,password 的基礎上還需要傳遞手機號碼,那麼我需要修改

無私分享ASP.NET CORE 專案實戰第二新增EF上下文物件,新增介面實現類以及無處不在的依賴注入DI

目錄索引 簡介   上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。 新增EF上下文物件   按照我們以前的習慣,我們還是新建幾個資料夾   Commons:存放幫助類   Domians:資料模型   Services

ASP.NET Core 專案實戰持續更新~~~

 一、前言   準備寫這個系列文章的設想開始於今年9月,毫無意外,期間又又又又拖了很長時間,文章主要是為了記錄自己學習使用 ASP.NET Core Web API 與 Vue 建立一個前後端分離的專案的整個過程。嗯,2018年快要結束了,應該能在 .NET Core 3.0 正式版和 Vue 3

乾貨分享ASP.NET COREC#與Spring Boot MVC(JAVA)異曲同工的程式設計方式總結

目錄 C# VS JAVA 基礎語法類比篇: 一、匿名類 二、型別初始化 三、委託(方法引用) 四、Lambda表示式 五、泛型 六、自動釋放

Asp.net core 專案實戰 新聞網站+後臺 原始碼設計原理 視訊教程

首先說明,視訊教程、原始碼並非本人原創 本人將專案分割開,並寫了一些說明。 該視訊教程 地址  https://study.163.com/course/courseMain.htm?courseId=1005955006 原作者 筆者正在學 ASP.NET Core ,發現這

.NET Core實戰專案之CMS 開發篇-Dapper封裝GURD及倉儲程式碼生成器實現

本篇我將帶著大家一起來對Dapper進行下封裝並實現基本的增刪改查、分頁操作的同步非同步方法的實現(已實現MSSQL,MySql,PgSQL)。同時我們再實現一下倉儲層的程式碼生成器,這樣的話,我們只需要結合業務來實現具體的業務部分的程式碼就可以了,可以大大減少我們重複而又繁瑣的增刪改查操作,多留點時間給生活

.NET Core實戰專案之CMS 開發篇-Dapper封裝CURD及倉儲程式碼生成器實現

本篇我將帶著大家一起來對Dapper進行下封裝並實現基本的增刪改查、分頁操作的同步非同步方法的實現(已實現MSSQL,MySql,PgSQL)。同時我們再實現一下倉儲層的程式碼生成器,這樣的話,我們只需要結合業務來實現具體的業務部分的程式碼就可以了,可以大大減少我們重複而又繁瑣的增刪改查操作,多留點時間給生活

ASP.NET Core 2.2 基礎知識() 發送 HTTP 請求

cell contain dns don olly configure () ati rim 可以註冊 IHttpClientFactory 並將其用於配置和創建應用中的 HttpClient 實例。 這能帶來以下好處: 提供一個中心位置,用於命名和配置邏輯 HttpCl

ASP.NET Core 2.2 基礎知識() 傳送 HTTP 請求

原文: ASP.NET Core 2.2 基礎知識(十二) 傳送 HTTP 請求 可以註冊 IHttpClientFactory 並將其用於配置和建立應用中的 HttpClient 例項。 這能帶來以下好處: 提供一箇中心位置,用於命名和配置邏輯&n