微軟在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;
-
}
以上。
-