.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
下载地址:https://dotnet.microsoft.com/download
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
也可以参照 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()]
public string Name { get; set; }
[MaxLength()]
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数据库连接方式
.net core WebAPI 初探及连接MySQL的更多相关文章
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...
- asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行
1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加us ...
- C# 之 .net core -- EF code first连接Mysql数据库
一.在Models 新建两个数据库类 这个是数据库需要生成的类基础(塑造外观) public class User { [Key] public string ID { get; set; } [Ma ...
- .net core 2.1 Ef 连接Mysql数据库 DB first
本文介绍.net core2.1版本下 Mysql数据库采用DB first方式使用Ef 点击查看更简单的方法 1. 新建基于.net core2.1的项目(略) 2. 从nuget中引用Micros ...
- ajax 调用 .net core WebAPI,报错 400 (Bad Request) Unexpected character encountered while parsing value
此文由博主前两天的提问及 dudu 的回答整理,地址:https://q.cnblogs.com/list/myquestion 情况说明 基于 .net core 写了一个 Web API,用 po ...
- 搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi
里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web>A ...
- 第八节:EF Core连接MySql数据库
一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...
- Spring Boot连接MySQL长时间不连接后报错`com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.`的解决办法
报错:com.mysql.cj.core.exceptions.ConnectionIsClosedException: No operations allowed after connection ...
- .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程
本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...
随机推荐
- (一)jdk8学习心得之遍历
一.遍历 -- 最好和stream流连用 使用jdk8提供的forEach进行遍历时,采用的是多线程的操作,理论上讲是会比原来的方法更快.但是注意,系统启动时需要加载lambda框架的内容.因此如果通 ...
- Kafka简介及使用PHP处理Kafka消息
Kafka简介及使用PHP处理Kafka消息 Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被 ...
- laravel 开启定时任务需要操作
1.在xshell 中 crontab -e //编辑任务crontab -l //查看执行中的任务列表 2.在打开的任务中: /home/wwwroot/default 换为自己项目的根路径 vag ...
- vue在html中出现{{}}原因及解决办法
在刚开始接触vue的时候,我们都是直接用<script>引入vue.js使用.没有借助vue-cli脚手架来构建项目. 对于一个初学者来说,跟着文档慢慢搬砖,使用vue进行数据绑定. 记得 ...
- 快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解
前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...
- git的命令行输出正确地显示中文文件名
参考:https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathn ...
- HDU4899 Hero meet devil DP套DP
陈老师的题QwQ 原题链接 题目大意 有两个字符串\(S\)和\(T\)(都只能由'A','C','G','T'这四个字符组成),\(S\)已知\(T\)未知,还知道\(S\)的长度为\(m\).求满 ...
- np.random.shuffle(x)的用法
此函数主要是通过改变序列的内容来修改序列的位置.此函数只沿多维数组的第一个轴移动数组.子数组的顺序已更改,但其内容保持不变. 参数 x:即将被打乱顺序的list 返回值 无
- Alertmanager 集群
Alertmanager 集群搭建 环境准备:2台主机 (centos 7) 192.168.31.151 192.168.31.144 1.安装部署 192.168.31.151 cd /usr/l ...
- Nginx 反向代理 负载均衡 虚拟主机
Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...