.Net Core 3.0 WebAPI && MySQL 8.0搭建詳情


微軟在2019924日發布了dotNet Core 3.0C# 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.0WebAPIMySQL 8.0的使用(本次實踐基於已有數據庫,沒有完成數據庫的需要使用WorkbenchNavicat搭建數據庫)。

  1. 准備工作

准備工作的目的是搭建一個便於我們調試的工程環境。考慮到以后用到微服務的可能,這里並不能用硬編碼(Hardcoding)寫死啟動的地址和端口,以下工作就是為了達到指定端口啟動的目的。

  1. 建立工程

    平常一些小項目我都用VS Code來創建工程了,但這次我使用Visual Studio 2019 16.3.5dotNet Core 3.0需要至少16.3的版本,如果用VS Code需要最新的C#插件)創建工程。

    為了日后上微服務可能,我們並不能寫死項目的啟動地址和端口;而且得益於dotNet Core自帶Kestrel,所以我並不打算使用IIS Express作為調試使用。在"解決方案次源管理器"中右擊項目名——"屬性"——"調試"——"配置文件"中選擇項目名對應項——"啟動"選擇"項目",""應用程序參數先不填,這個后面會用到。

     

  2. 添加啟動參數

    要想指定地址和端口啟動,我們可以用硬編碼;也可以讀取Json配置;也可以像我一樣,在程序啟動時傳入參數。下面介紹如何通過重寫Program.cs來讀取程序的啟動參數。

    可以刪除CreateHostBuilder方法,並填加如下方法:

    1. public static IWebHost BuildWebHost(string[] args)  
    2. {  
    3.     var config = new ConfigurationBuilder()  
    4.     .AddCommandLine(args)  
    5.     .Build();  
    6.     string ip = config["ip"];  
    7.     string port = config["port"];  
    8.     Console.WriteLine($"ip={ip}:port={port}");  
    9.     return WebHost.CreateDefaultBuilder(args)  
    10.     .UseStartup<Startup>()  
    11.     .UseUrls($"http://{ip}:{port}")  
    12.     .Build();  
    13. }  

    修改Main方法為:

    1. public static void Main(string[] args)  
    2. {  
    3.     BuildWebHost(args).Run();  
    4. }  

     

    在項目"屬性"頁——"調試"選項卡——"應用程序參數"中填寫相應參數,例如我這里填寫"—ip 127.0.0.1 –port 8000"。

    在調試按鈕的下拉選項中選擇項目名。

    到此,按F5Ctrl+F5啟動調試,瀏覽器會跳轉到我們指定的地址和端口。

    1. 添加數據庫

    官方教程並沒有給出添加MySQL的實例,但其過程和SQL Server是一樣的。

  3. 准備工作

    添加NuGet包:在"程序包管理器控制台"中鍵入:

    dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.18

    我並沒有使用Pomelo庫,而用的是MySQL官方庫,截止到當天是8.0.18

    創建如下幾個目錄:

    Data——用來存放數據庫上下文等數據文件

    Models——用來存放數據模型

  4. 創建模型

    Models目錄下創建與數據庫匹配的數據模型TestModel.cs。如要指定主鍵,可以用[Key]屬性在模型中指定。

    1. using System;    
    2. using System.ComponentModel.DataAnnotations;    
    3. namespace LRMS.Server    
    4. {    
    5.     public class TestModel    
    6.     {    
    7.         [Key]    
    8.         public int uid { getset; }    
    9.         public string username { getset; }    
    10.         public string password { getset; }    
    11.     }    
    12. }  

     

  5. 創建數據庫上下文

    Data目錄下創建數據庫上下文TestDbContext.cs。在上下文中使用EF Core中的DbSet類型創建對應的與數據表名稱(可忽略大小寫)相應的實例。

    1. using Microsoft.EntityFrameworkCore;    
    2. namespace LRMS.Server    
    3. {    
    4.     public class UserInfoDbContext : DbContext    
    5.     {    
    6.         public UserInfoDbContext(DbContextOptions options) : base(options) { }    
    7.         public DbSet<TestModel> User_Login { getset; }    
    8.     }    
    9. }    
  6. 添加數據庫連接字

    打開在工程的根目錄下的appsettings.json。替換以下對象:

    1. {  
    2.     "ConnectionStrings": {  
    3.         "連接字名稱""Server=數據庫地址;uid=數據庫賬戶;pwd=數據庫密碼;database=數據庫Schema;charset=utf8;SslMode=None;",  
    4.     },  
    5.     "Logging": {  
    6.         "LogLevel": {  
    7.             "Default""Information",  
    8.             "Microsoft""Warning",  
    9.             "Microsoft.Hosting.Lifetime""Information"  
    10.         }  
    11.     },  
    12.     "AllowedHosts""*"  
    13. }  

     

    打開Startup.cs,在CoinfigureServices方法中添加如下代碼:

    1. public void ConfigureServices(IServiceCollection services)  
    2. {  
    3.     services.AddControllers();  
    4.     services.AddDbContext<UserInfoDbContext>(options =>  
    5.     {  
    6.         options.UseMySQL(Configuration.GetConnectionString("連接字名稱"));  
    7.     });  
    8. }  

    到此,數據庫的使用部分結束了。

    1. 后續

    為了安全,防止泄漏,在控制器中我們並不能直接使用數據庫上下文,下面的代碼展示了一種簡單的處理。

    1. // 創建私有、只讀的數據庫上下文實例  
    2. private readonly UserInfoDbContext _db;  
    3. // 構造函數中為其賦值  
    4. public UserLoginController(UserInfoDbContext db)  
    5. {  
    6.     _db = db;  
    7. }  

     

    以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM