1. 程式人生 > 資料庫 >.net core WebAPI 初探及連線MySQL

.net core WebAPI 初探及連線MySQL

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

下載地址:

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

也可以參照  中其它方法。其它資料庫提供程式可參照 。

安裝成功後可以在依賴項中看到 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 測試。由下圖可以看到獲取了返回值。

 

 【參考】