1. 前言
筆者最近跟着微軟官方文檔學習.net core WebAPI,但發現其對 WebAPI 連接數據庫、讀取數據庫方面講得不夠細致明了。寫此文的目的,即實現 .net core WebAPI 的 GET、POST 方法訪問數據庫,並輸出結果。
2. 開發准備
2.1 操作系統
Windows 10 / Windows 7
2.2 .net core sdk
.net core 2.2
下載地址:https://dotnet.microsoft.com/download
2.3 開發工具
Visual Studio 2017
3. 創建 .net core WebAPI 項目
用 Visul Studio 2017 新建項目,在出現的對話框中選擇 .NET Core -> ASP.NET Core Web 應用程序,並輸入項目名稱。

單擊【確定】后,在出現的對話框中選擇【API】,注意不要勾選【啟用Docker支持】,身份驗證方式為【不進行身份驗證】,然后單擊【確定】。

之后生成了相應的模板項目,如下圖所示。

從圖中可以看到,默認的項目文件中已經包含了 Controllers。其為控制器文件夾,用來進行業務編寫的代碼,我們基本上需要在這個文件中進行數據的傳出與接收。相應的,我們還可以進行各個文件創建,進行層次區分,也可以建立單獨的類項目,進行層次區分,如控制層,服務業務層,數據連接層,模型實體層。
另外,
appsettings:配置文件,此處可以編寫一些常量設置,然后在程序中進行讀取。
Program:項目啟動文件。
Startup:項目配置設置文件。
4. 連接數據庫
4.1 連接 MySQL 數據庫
首先,利用 Visul Studio 2017 中的 nuget 安裝 MySql.Data.EntityFrameworkCore,輸入如下命令。
Install-Package MySql.Data.EntityFrameworkCore -Version 8.0.15
也可以參照 https://www.nuget.org/packages/MySql.Data.EntityFrameworkCore 中其它方法。其它數據庫提供程序可參照 https://docs.microsoft.com/zh-cn/ef/core/providers/index。

安裝成功后可以在依賴項中看到 MySql.Data.EntityFrameworkCore

接下來創建一個數據表結構,並添入示例數據,例如下圖。


C#中創建對應的實體類,另外創建一個類繼承dbContext,dbContext是EF框架中非常重要的一個環節,是建立實體類與數據庫連接的橋梁,具體的原理,這里不進行贅述。
創建過程如下代碼所示(注意要自行在項目中添加 Models 文件夾,並添加實體類文件,如 Person.cs)。
Models/Person.cs
using System.ComponentModel.DataAnnotations;
namespace WebApi.Models
{
public class Person
{
[Key]
public int Id { get; set; }
[MaxLength(20)]
public string Name { get; set; }
[MaxLength(3)]
public int Age { get; set; }
}
}
Models/CoreDbContext.cs
using Microsoft.EntityFrameworkCore;namespace WebApi.Models
{
public class CoreDbContext : DbContext
{
public virtual DbSet<Person> Person { get; set; } //創建實體類添加Context中
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseMySQL(@"server=localhost;uid=YourUserId;pwd=YourPassword;
port=3306;database=DbName;sslmode=Preferred;");
}
}
}
}

下面改寫 ValuesController.cs 中相關代碼,以測試 GET 方法。
Controllers/ValuesController.cs
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using WebApi.Models;
namespace WebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public List<Person> Get()
{
using (CoreDbContext _coreDbContext = new CoreDbContext())
{
return _coreDbContext.Set<Person>().ToList();
}
}
......
}
}
調試運行結果如下

表示數據庫已經連接成功,並以 GET 方法取得數據。
4.2 連接數據庫的寫法改進
針對上述的連接屬性的情況來看,我們不應該把連接的屬性編寫在代碼中,因此我們要設計一下,把連接的屬性編寫在配置文件中,對appsettings.json,Startup.cs,CoreDbContext.cs進行相關的配置,如下所示。
appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "server=localhost;uid=YourUserId;pwd=YourPassword;port=3306;database=DbName;sslmode=Preferred;"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
Startup.cs
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//連接 mysql 數據庫,添加數據庫上下文
services.AddDbContext<CoreDbContext>(options =>
options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
CoreDbContext.cs
using Microsoft.EntityFrameworkCore;
namespace WebApi.Models
{
public class CoreDbContext : DbContext
{
public virtual DbSet<Person> Person { get; set; } //創建實體類添加Context中
public CoreDbContext(DbContextOptions<CoreDbContext> options) : base(options)
{
}
}
}
上述代碼高亮部分就是要修改或添加的內容,這時其實是已經把coreDbContext注入到容器中進行操作,而容器中對Context的注入方式為瞬時注入,因此后面要用到依賴注入的時候,很多時候,在數據層使用context的時候需要把對應的注入都設計為瞬時注入的形式,此處就不進行過多的提及。
我們在進行測試一下,這下我們就不用自己進行context的new操作,由於我們一開始進行設置的時候就已經進行了依賴注入的形式,不過,.netCore中只有構造注入,沒有屬性注入,因此我們就用構造注入的方式進行,如下所示。
Controllers/ValuesController.cs
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using WebApi.Models;
namespace WebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly CoreDbContext _coreDbContext;
public ValuesController(CoreDbContext coreDbContext)
{
_coreDbContext = coreDbContext;
}
// GET api/values
[HttpGet]
public List<Person> Get()
{
return _coreDbContext.Set<Person>().ToList();
}
......
}
}
至此寫法改進完成。
4.3 關於 post 方法
在 Controllers/ValuesController.cs 中將模板文件的 Post 方法替換為
// POST api/values
[HttpPost]
public List<Person> Post()
{
return _coreDbContext.Set<Person>().ToList();
}
發布API后(搭建及發布過程此處不做講解),用 Postman 測試。由下圖可以看到獲取了返回值。


