【無私分享:ASP.NET CORE 項目實戰】目錄索引html
增長對多數據庫的支持,並非意味着同時對多種數據庫操做,固然,後面,咱們會嘗試同時對多種數據庫操做,這可能須要多個上下文,暫且不論。分佈式數據庫,咱們採用的是阿里雲的Mycat,這個後面會更新出來。咱們今天的場景是:咱們的項目多是在windows上開發的使用的是SqlServer,咱們要發佈到linux上,SqlServer 2017 聽說是支持liunx的,可是還沒出... 固然不是說 SqlServer 就不能裝在liunx上,可是咱們的Liunx服務器可能已經安裝了MySql或 Oracle,咱們但願使用現有的,又或者是,咱們須要切換數據庫。那麼,咱們須要能夠隨時切換數據庫的支持。mysql
使用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