.net core WebAPI 初探及鏈接MySQL

1. 前言

筆者最近跟着微軟官方文檔學習.net core WebAPI,但發現其對 WebAPI 鏈接數據庫、讀取數據庫方面講得不夠細緻明瞭。寫此文的目的,即實現 .net core WebAPI 的 GET、POST 方法訪問數據庫,並輸出結果。mysql

2. 開發準備

2.1 操做系統

Windows 10 / Windows 7sql

2.2 .net core sdk

.net core 2.2數據庫

下載地址:https://dotnet.microsoft.com/downloadjson

2.3 開發工具

Visual Studio 2017api

3. 建立 .net core WebAPI 項目

用 Visul Studio 2017 新建項目,在出現的對話框中選擇 .NET Core -> ASP.NET Core Web 應用程序,並輸入項目名稱。app

 單擊【肯定】後,在出現的對話框中選擇【API】,注意不要勾選【啓用Docker支持】,身份驗證方式爲【不進行身份驗證】,而後單擊【肯定】。框架

 以後生成了相應的模板項目,以下圖所示。ide

從圖中能夠看到,默認的項目文件中已經包含了 Controllers。其爲控制器文件夾,用來進行業務編寫的代碼,咱們基本上須要在這個文件中進行數據的傳出與接收。相應的,咱們還能夠進行各個文件建立,進行層次區分,也能夠創建單獨的類項目,進行層次區分,如控制層,服務業務層,數據鏈接層,模型實體層。工具

另外,post

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 測試。由下圖能夠看到獲取了返回值。

 

 【參考】開源中國:.netCore搭建WebAPI,以及MySQL,SQL server數據庫鏈接方式

相關文章
相關標籤/搜索