全栈练习一:asp.net core 2.1 webapi连接postgrest数据库从零开始

前言

VUE入门一段时间了,想要了解一些先进的后端技术,以便于快速流畅的实现一些小型系统。技术栈先划定为ASP .NET CORE的WEB API作为后端,数据库PostgreSQL,前端主要为VUE全家桶 + element-ui。总体比较适合全栈新手。本文为第一篇,当前内容仍在逐步修改更新。

本节参考文档

微软官方文档,和一个清晰的code first代码例子
以及一个异常简单清晰的EntityFramework6 快速入门教程
参考前2篇文章快速实现通过code创建数据库表,连接数据库并实现webapi的增查删改

分步实现

建项目

下载dotnet core sdk 2.1.5 https://www.microsoft.com/net/download
在 Visual Studio 中执行以下步骤:
从“文件”菜单中选择“新建” > “项目”。
选择“ASP.NET Core Web 应用程序”模板。 将项目命名为 TodoApi,然后单击“确定”。
在“新建 ASP.NET Core Web 应用程序 - TodoApi”对话框中,选择 ASP.NET Core 版本。 选择“API”模板,然后单击“确定”。 请不要选择“启用 Docker 支持”。

新建实体类

在解决方案资源管理器中,右键单击项目。 选择“添加” > “新建文件夹”。 将文件夹命名为“Models”。
在解决方案资源管理器中右键单击“模型”文件夹,然后选择“添加” > “类”。 将类命名为 TodoItem,然后单击“添加”。
使用以下代码更新 TodoItem 类:

using System;
using System.ComponentModel.DataAnnotations;
namespace TodoApi.Models
{
    public class TodoItem
    {
        /// <summary>
        /// 匹配编号
        /// </summary>
        [Key]
        public Guid Gid { get; set; }
        /// <summary>
        /// 上传文件名
        /// </summary>
        public string UploadFileName { get; set; }
        /// <summary>
        /// 上传文件路径
        /// </summary>
        public string UploadFilePath { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }
        /// <summary>
        /// 状态 0:匹配中  1:匹配完成未下载 2:匹配完成已下载
        /// </summary>
        public int Status { get; set; }
        /// <summary>
        /// 下载文件名
        /// </summary>
        public string DownloadFileName { get; set; }
        /// <summary>
        /// 下载文件路径
        /// </summary>
        public string DownloadFilePath { get; set; }
        /// <summary>
        /// 下载时间
        /// </summary>
        public DateTime? DownloadTime { get; set; }
        /// <summary>
        /// 下载次数
        /// </summary>
        public int DownLoadCount { get; set; }
    }
}

引入依赖

VS 工具-Nuget包管理器-包管理器控制台 打开PM输入以下命令添加依赖包

Install-Package Npgsql.EntityFrameworkCore.PostgreSQL
Install-Package Npgsql.EntityFrameworkCore.PostgreSQL.Design
Install-Package Microsoft.EntityFrameworkCore.Tools

将连接字符串写入appsetting.json

并修改ip,数据库名和用户密码:
注意:这里的连接字符串默认会使用Pooling=true; 使用中连接池上限100,释放不掉会报错。
临时解决办法是字符串使用:
"PostgreSql": "User ID=postgres;Password=postgres;Host=localhost;Port=5432;Database=mydatabase;Pooling=false;"

{
  "ConnectionStrings": {
    "PostgreSql": "User ID=postgres;Password=postgres;Host=localhost;Port=5432;Database=mydatabase"
  },
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  }
}

修改startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.IO;
using TodoApi.Models;
using Microsoft.Extensions.Configuration;//引入Configuration

namespace TodoApi
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddDbContext<TodoContext>(option => option.UseNpgsql(Configuration.GetConnectionString("PostgreSql")));
        }
          public void Configure(IApplicationBuilder app)
          {
            app.UseDefaultFiles();
            app.UseStaticFiles();
            app.UseMvc();
          }
    }
   
}

创建数据库上下文

数据库上下文是为给定数据模型协调实体框架功能的主类。 此类由Microsoft.EntityFrameworkCore.DbContext 类派生而来。在解决方案资源管理器中右键单击“模型”文件夹,然后选择“添加” > “类”。 将类命名为 TodoContext,然后单击“添加”。
将该类替换为以下代码:

using Microsoft.EntityFrameworkCore;
namespace TodoApi.Models{
    public class TodoContext :DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options):base(options){

        }
        public DbSet<TodoItem> TodoItems {get;set;}

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
}

选择一:VS可使用 包管理器命令

Add-Migration TodoItem
Update-Database

选择二:VS CODE或者其他命令行工具,可使用控制台命令(项目目录下执行)

dotnet ef migrations add TodoItem
dotnet ef database update

命令全部DONE的话,数据库表已建立完成

开始添加控制器

在解决方案资源管理器中,右键单击“Controllers”文件夹。 选择 添加 > 新建项。 在“添加新项”对话框中,选择“API 控制器类”模板。 将类命名为 TodoController,然后单击“添加”。修改内容为:

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using TodoApi.Models;
using System;
namespace TodoApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TodoController : ControllerBase
    {
        private readonly TodoContext _context;

        public TodoController(TodoContext context)
        {
            _context = context;

            if (_context.TodoItems.Count() == 0)
            {
                // Create a new TodoItem if collection is empty,
                // which means you can't delete all TodoItems.
                _context.TodoItems.Add(new TodoItem { UploadFileName = "Item1" });
                _context.SaveChanges();
            }
        }
        [HttpGet]
        public ActionResult<List<TodoItem>> GetAll()
        {
            return _context.TodoItems.ToList();
        }

        [HttpGet("{gid}", Name = "GetTodo")]
        public ActionResult<TodoItem> GetById(Guid gid)
        {
            var item = _context.TodoItems.Find(gid);
            if (item == null)
            {
                return NotFound();
            }
            return item;
        }
    }
   
}

测试使用webapi

在VS中Ctrl+F5运行,浏览器输入:
https://localhost:44315/api/todo
TodoController返回GetAll的结果json

复制其中的guid如‘12c82bb4-207b-4e31-be9a-1aba4a5b8222’
浏览器请求https://localhost:44315/api/todo/12c82bb4-207b-4e31-be9a-1aba4a5b8222
获取指定Guid的对象。
get api示例到此结束。

实现其他增改删CUD操作

实现创建,在TodoController下继续增加:

[HttpPost]
public IActionResult Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    _context.SaveChanges();

    return CreatedAtRoute("GetTodo", new {  gid = item.Gid }, item);
}

关掉之前调试的网页重新Ctrl+F5,然后postman中发一条post,创建成功
post测试
继续增加修改和删除代码

		[HttpPut("{gid}")]
        public IActionResult Update(Guid gid, TodoItem item)
        {
            var todo = _context.TodoItems.Find(gid);
            if (todo == null)
            {
                return NotFound();
            }

            todo.UploadFileName = item.UploadFileName;
            todo.UploadFilePath = item.UploadFilePath;
            todo.CreateTime = item.CreateTime;
            todo.Status = item.Status;
            todo.DownloadFileName = item.DownloadFileName;
            todo.DownloadFilePath = item.DownloadFilePath;
            todo.DownloadTime = item.DownloadTime;
            todo.DownLoadCount = item.DownLoadCount;

            _context.TodoItems.Update(todo);
            _context.SaveChanges();
            return NoContent();
        }

        [HttpDelete("{gid}")]
        public IActionResult Delete(Guid gid)
        {
            var todo = _context.TodoItems.Find(gid);
            if (todo == null)
            {
                return NotFound();
            }

            _context.TodoItems.Remove(todo);
            _context.SaveChanges();
            return NoContent();
        }
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值