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. jexus独立版设置支持https

    先用命令找到libssl.so find / -name libssl.so.* 执行完命令之后找到libssl.so.x.x.x如(libssl.so.1.0.0) 再到jexus/runtime/ ...

  2. 在Asp.Net Core中集成ABP Dapper

    在实际的项目中,除了集成ABP框架的EntityFrameworkCore以外,在有些特定的场景下不可避免地会使用一些SQL查询语句,一方面是由于现在的EntityFrameworkCore2.X有些 ...

  3. mysql原生语句基础知识

    要操作数据库,首先要登录mysql: *mysql -u root -p 密码 创建数据库: *create database Runoob(数据库名); 删除数据库: *drop database ...

  4. 内存溢出OOM

    如何避免OOM 异常? 想要避免OOM 异常首先我们要知道什么情况下会导致OOM 异常. 1.图片过大导致OOM Android 中用bitmap 时很容易内存溢出,比如报如下错误:Java.lang ...

  5. 「Algospot」津巴布韦ZIMBABWE

    同时考验对状压DP和数位DP的理解: 传送门:$>here<$ 题意 给出一个数字$e$,现在对$e$通过$m$进行变换得到$x$:变换的要求是:1.只能改变原数字$e$各个数位的顺序(可 ...

  6. The King’s Problem HDU - 3861(连通图 缩点 匹配)

    在一个王国里面, 国王有一个新的问题. 皇城中有N个城市M条单行路,为了让他的王国更加高效,国王想要将他的王国划分成几个州,每个城市必须属于一个州.对于两个城市(u,v),必须满足以下3个条件:   ...

  7. content-type 组件

    content-type初识 什么是content-type ContentType是Django的内置的一个应用,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中 ...

  8. Lending Club—构建贷款违约预测模型

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  9. [面试]死锁-最简单的死锁demo

    死锁 什么是死锁 (百度百科) 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁 ...

  10. Dynamics CRM 日常使用JS整理(三)

    一.指定 Partylist 类型字段能 lookup 的实体(以 Appointment 中某个字段为例子): var control = Xrm.Page.getControl("req ...