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的更多相关文章

  1. 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程

    #前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...

  2. asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行

    1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加us ...

  3. C# 之 .net core -- EF code first连接Mysql数据库

    一.在Models 新建两个数据库类 这个是数据库需要生成的类基础(塑造外观) public class User { [Key] public string ID { get; set; } [Ma ...

  4. .net core 2.1 Ef 连接Mysql数据库 DB first

    本文介绍.net core2.1版本下 Mysql数据库采用DB first方式使用Ef 点击查看更简单的方法 1. 新建基于.net core2.1的项目(略) 2. 从nuget中引用Micros ...

  5. 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 ...

  6. 搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

    里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web>A ...

  7. 第八节:EF Core连接MySql数据库

    一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...

  8. 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 ...

  9. .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程

    本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...

随机推荐

  1. git基本概念

    工作区:电脑上存放源代码的文件夹 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库.       版本库包含stage(暂存区),master分支,以及指向master分支的指 ...

  2. 安装php的lavavel框架的流程(亲测)

    windows上安装配置laravel 初次接触laravel会觉得它的安装方式比较不一样,与Linux上安装软件的方式很相似. 学习laravel的最好方式当然是看官方文档,笔者就在这里讲官方文档上 ...

  3. Comet OJ - Contest #1

    A:随便怎么暴力. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 25 char ...

  4. 深入理解 GIL:如何写出高性能及线程安全的 Python 代码

    深入理解 GIL:如何写出高性能及线程安全的 Python 代码 本文由 伯乐在线 - 郑芸 翻译.未经许可,禁止转载!英文出处:A. Jesse.欢迎加入翻译组. GIL对多线程的影响:http:/ ...

  5. 【THUSC2017】【LOJ2982】宇宙广播 计算几何 高斯消元

    题目大意 有 \(n\) 个 \(n\) 维空间中的球,求这些球的所有公切面. 保证不会无解或有无穷多组解. \(n\leq 10\) 题解 你可以认为这是一道传统题. 记公切面为 \(a_1x_1+ ...

  6. UOJ#449. 【集训队作业2018】喂鸽子(期望dp)

    题意 有 \(n\) 只鸽子,每只鸽子需要 \(k\) 粒玉米才能喂饱.问每次随意喂给 \(n\) 个鸽子中的一个,期望多久所有鸽子都被喂饱. 对于 \(998244353\) 取模. 数据范围 \( ...

  7. 第一模块:Python基础(二)

    目录 1.变量 常量 2.用户交互和注释 程序交互 注释 字符串 布尔型(bool) 格式化输出 运算符 while 循环 @(开发基础) 1.变量 变量用于存储要在计算机程序中引用和操作的信息.它们 ...

  8. Linux-高可用Keepalived概念篇

    keepalived 高可用 Keepalived介绍 Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可 ...

  9. Kafka分区分配策略(Partition Assignment Strategy

    问题 用过 Kafka 的同学用过都知道,每个 Topic 一般会有很多个 partitions.为了使得我们能够及时消费消息,我们也可能会启动多个 Consumer 去消费,而每个 Consumer ...

  10. hbuilder、hbuilderx和vscode对比

    1. 从内存来对比 1.1 vscode占用内存 打开同一个项目,发现vscode占用内存比较多 1.2 HBuilder占用内存 1.3 HBuilderx占用内存 1.4 对比 从内存上来看,HB ...