微軟在2019年9月24日發佈了dotNet Core 3.0和C# 8.0,添加了許多新Features,詳情點我。無疑dotNet Core 3.0和一個月之後即將發佈的dotNet Core 3.1對於dotNet來說是一個重要的里程碑。 對於MySQL而言,現在越來越多的商業公司使用MySQ... ...
微軟在2019年9月24日發佈了dotNet Core 3.0和C# 8.0,添加了許多新Features,詳情點我。無疑dotNet Core 3.0和一個月之後即將發佈的dotNet Core 3.1對於dotNet來說是一個重要的里程碑。
對於MySQL而言,現在越來越多的商業公司使用MySQL來作為自己的主要資料庫,雖然MySQL已經迎來了8.0的版本,有著更完善的數據能力,更好的性能,但是還是有很多公司在新項目上使用MySQL5.7。我在技術上很鄙視這樣的做法,一旦使用的老技術Out of support,對已有項目的改動和遷移所做的努力將會是當初學習新和試錯的N倍。
言歸正傳,今天來記錄一下使用dotNet Core 3.0的WebAPI和MySQL 8.0的使用(本次實踐基於已有資料庫,沒有完成資料庫的需要使用Workbench或Navicat搭建資料庫)。
- 準備工作
準備工作的目的是搭建一個便於我們調試的工程環境。考慮到以後用到微服務的可能,這裡並不能用硬編碼(Hardcoding)寫死啟動的地址和埠,以下工作就是為了達到指定埠啟動的目的。
- 建立工程
平常一些小項目我都用VS Code來創建工程了,但這次我使用Visual Studio 2019 16.3.5(dotNet Core 3.0需要至少16.3的版本,如果用VS Code需要最新的C#插件)創建工程。
為了日後上微服務可能,我們並不能寫死項目的啟動地址和埠;而且得益於dotNet Core自帶Kestrel,所以我並不打算使用IIS Express作為調試使用。在"解決方案次源管理器"中右擊項目名——"屬性"——"調試"——"配置文件"中選擇項目名對應項——"啟動"選擇"項目",""應用程式參數先不填,這個後面會用到。
- 添加啟動參數
要想指定地址和埠啟動,我們可以用硬編碼;也可以讀取Json配置;也可以像我一樣,在程式啟動時傳入參數。下麵介紹如何通過重寫Program.cs來讀取程式的啟動參數。
可以刪除CreateHostBuilder方法,並填加如下方法:
- public static IWebHost BuildWebHost(string[] args)
- {
- var config = new ConfigurationBuilder()
- .AddCommandLine(args)
- .Build();
- string ip = config["ip"];
- string port = config["port"];
- Console.WriteLine($"ip={ip}:port={port}");
- return WebHost.CreateDefaultBuilder(args)
- .UseStartup<Startup>()
- .UseUrls($"http://{ip}:{port}")
- .Build();
- }
修改Main方法為:
- public static void Main(string[] args)
- {
- BuildWebHost(args).Run();
- }
在項目"屬性"頁——"調試"選項卡——"應用程式參數"中填寫相應參數,例如我這裡填寫"—ip 127.0.0.1 –port 8000"。
在調試按鈕的下拉選項中選擇項目名。
到此,按F5或Ctrl+F5啟動調試,瀏覽器會跳轉到我們指定的地址和埠。
- 添加資料庫
官方教程並沒有給出添加MySQL的實例,但其過程和SQL Server是一樣的。
- 準備工作
添加NuGet包:在"程式包管理器控制台"中鍵入:
dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.18
我並沒有使用Pomelo庫,而用的是MySQL官方庫,截止到當天是8.0.18。
創建如下幾個目錄:
Data——用來存放資料庫上下文等數據文件
Models——用來存放數據模型
- 創建模型
在Models目錄下創建與資料庫匹配的數據模型TestModel.cs。如要指定主鍵,可以用[Key]屬性在模型中指定。
- using System;
- using System.ComponentModel.DataAnnotations;
- namespace LRMS.Server
- {
- public class TestModel
- {
- [Key]
- public int uid { get; set; }
- public string username { get; set; }
- public string password { get; set; }
- }
- }
- 創建資料庫上下文
在Data目錄下創建資料庫上下文TestDbContext.cs。在上下文中使用EF Core中的DbSet類型創建對應的與數據表名稱(可忽略大小寫)相應的實例。
- using Microsoft.EntityFrameworkCore;
- namespace LRMS.Server
- {
- public class UserInfoDbContext : DbContext
- {
- public UserInfoDbContext(DbContextOptions options) : base(options) { }
- public DbSet<TestModel> User_Login { get; set; }
- }
- }
- 添加資料庫連接字
打開在工程的根目錄下的appsettings.json。替換以下對象:
- {
- "ConnectionStrings": {
- "連接字名稱": "Server=資料庫地址;uid=資料庫賬戶;pwd=資料庫密碼;database=資料庫Schema;charset=utf8;SslMode=None;",
- },
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- },
- "AllowedHosts": "*"
- }
打開Startup.cs,在CoinfigureServices方法中添加如下代碼:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddControllers();
- services.AddDbContext<UserInfoDbContext>(options =>
- {
- options.UseMySQL(Configuration.GetConnectionString("連接字名稱"));
- });
- }
到此,資料庫的使用部分結束了。
- 後續
為了安全,防止泄漏,在控制器中我們並不能直接使用資料庫上下文,下麵的代碼展示了一種簡單的處理。
- // 創建私有、只讀的資料庫上下文實例
- private readonly UserInfoDbContext _db;
- // 構造函數中為其賦值
- public UserLoginController(UserInfoDbContext db)
- {
- _db = db;
- }
以上。