zoukankan      html  css  js  c++  java
  • .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. }  

       

      以上。

  • 相关阅读:
    纪念又一次ak
    hdu5618
    bzoj3393
    bzoj3438
    [JSOI2007]建筑抢修
    [CQOI2014]数三角形
    [BZOJ2662][BeiJing wc2012]冻结
    [NOIP2015]运输计划
    [ZJOI2006]超级麻将
    [APIO2009]抢掠计划
  • 原文地址:https://www.cnblogs.com/mcf52259/p/11707240.html
Copyright © 2011-2022 走看看