.Net Core 3.0 WebAPI && MySQL 8.0搭建详情
微软在2019年9月24日发布了dotnet core 3.0和c# 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.0的webapi和mysql 8.0的使用(本次实践基于已有数据库,没有完成数据库的需要使用workbench或navicat搭建数据库)。
- 准备工作
准备工作的目的是搭建一个便于我们调试的工程环境。考虑到以后用到微服务的可能,这里并不能用硬编码(hardcoding)写死启动的地址和端口,以下工作就是为了达到指定端口启动的目的。
-
建立工程
平常一些小项目我都用vs code来创建工程了,但这次我使用visual studio 2019 16.3.5(dotnet core 3.0需要至少16.3的版本,如果用vs code需要最新的c#插件)创建工程。
为了日后上微服务可能,我们并不能写死项目的启动地址和端口;而且得益于dotnet core自带kestrel,所以我并不打算使用iis express作为调试使用。在"解决方案次源管理器"中右击项目名——"属性"——"调试"——"配置文件"中选择项目名对应项——"启动"选择"项目",""应用程序参数先不填,这个后面会用到。
-
添加启动参数
要想指定地址和端口启动,我们可以用硬编码;也可以读取json配置;也可以像我一样,在程序启动时传入参数。下面介绍如何通过重写program.cs来读取程序的启动参数。
可以删除createhostbuilder方法,并填加如下方法:
- public static iwebhost buildwebhost(string[] args)
- {
- var config = new configurationbuilder()
- .addcommandline(args)
- .build();
- string ip = config["ip"];
- string port = config["port"];
- console.writeline($"ip={ip}:port={port}");
- return webhost.createdefaultbuilder(args)
- .usestartup<startup>()
- .useurls($"http://{ip}:{port}")
- .build();
- }
修改main方法为:
- public static void main(string[] args)
- {
- buildwebhost(args).run();
- }
在项目"属性"页——"调试"选项卡——"应用程序参数"中填写相应参数,例如我这里填写"—ip 127.0.0.1 –port 8000"。
在调试按钮的下拉选项中选择项目名。
到此,按f5或ctrl+f5启动调试,浏览器会跳转到我们指定的地址和端口。
- 添加数据库
官方教程并没有给出添加mysql的实例,但其过程和sql server是一样的。
-
准备工作
添加nuget包:在"程序包管理器控制台"中键入:
dotnet add package mysql.data.entityframeworkcore --version 8.0.18
我并没有使用pomelo库,而用的是mysql官方库,截止到当天是8.0.18。
创建如下几个目录:
data——用来存放数据库上下文等数据文件
models——用来存放数据模型
-
创建模型
在models目录下创建与数据库匹配的数据模型testmodel.cs。如要指定主键,可以用[key]属性在模型中指定。
- using system;
- using system.componentmodel.dataannotations;
- namespace lrms.server
- {
- public class testmodel
- {
- [key]
- public int uid { get; set; }
- public string username { get; set; }
- public string password { get; set; }
- }
- }
-
创建数据库上下文
在data目录下创建数据库上下文testdbcontext.cs。在上下文中使用ef core中的dbset类型创建对应的与数据表名称(可忽略大小写)相应的实例。
- using microsoft.entityframeworkcore;
- namespace lrms.server
- {
- public class userinfodbcontext : dbcontext
- {
- public userinfodbcontext(dbcontextoptions options) : base(options) { }
- public dbset<testmodel> user_login { get; set; }
- }
- }
-
添加数据库连接字
打开在工程的根目录下的appsettings.json。替换以下对象:
- {
- "connectionstrings": {
- "连接字名称": "server=数据库地址;uid=数据库账户;pwd=数据库密码;database=数据库schema;charset=utf8;sslmode=none;",
- },
- "logging": {
- "loglevel": {
- "default": "information",
- "microsoft": "warning",
- "microsoft.hosting.lifetime": "information"
- }
- },
- "allowedhosts": "*"
- }
打开startup.cs,在coinfigureservices方法中添加如下代码:
- public void configureservices(iservicecollection services)
- {
- services.addcontrollers();
- services.adddbcontext<userinfodbcontext>(options =>
- {
- options.usemysql(configuration.getconnectionstring("连接字名称"));
- });
- }
到此,数据库的使用部分结束了。
- 后续
为了安全,防止泄漏,在控制器中我们并不能直接使用数据库上下文,下面的代码展示了一种简单的处理。
- // 创建私有、只读的数据库上下文实例
- private readonly userinfodbcontext _db;
- // 构造函数中为其赋值
- public userlogincontroller(userinfodbcontext db)
- {
- _db = db;
- }
以上。
上一篇: 尚可喜为什么会被自己的儿子要挟*呢
下一篇: 七、并发容器