.net core WebAPI 初探及链接MySQL

1. 前言

笔者最近跟着微软官方文档学习.net core WebAPI,但发现其对 WebAPI 链接数据库、读取数据库方面讲得不够细致明了。写此文的目的,即实现 .net core WebAPI 的 GET、POST 方法访问数据库,并输出结果。mysql

2. 开发准备

2.1 操做系统

Windows 10 / Windows 7sql

2.2 .net core sdk

.net core 2.2数据库

下载地址:https://dotnet.microsoft.com/downloadjson

2.3 开发工具

Visual Studio 2017api

3. 建立 .net core WebAPI 项目

用 Visul Studio 2017 新建项目,在出现的对话框中选择 .NET Core -> ASP.NET Core Web 应用程序,并输入项目名称。app

 单击【肯定】后,在出现的对话框中选择【API】,注意不要勾选【启用Docker支持】,身份验证方式为【不进行身份验证】,而后单击【肯定】。框架

 以后生成了相应的模板项目,以下图所示。ide

从图中能够看到,默认的项目文件中已经包含了 Controllers。其为控制器文件夹,用来进行业务编写的代码,咱们基本上须要在这个文件中进行数据的传出与接收。相应的,咱们还能够进行各个文件建立,进行层次区分,也能够创建单独的类项目,进行层次区分,如控制层,服务业务层,数据链接层,模型实体层。工具

另外,post

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(20)]
        public string Name { get; set; }
        [MaxLength(3)]
        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数据库链接方式

相关文章
相关标签/搜索