循序渐进学.Net Core Web Api开发系列【8】:访问数据库(基本功能)

系列目录

循序渐进学.Net Core Web Api开发系列目录

本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi

一、概述

本篇讨论如何连接数据库,包括连接SQL Server 和 连接MySQL,然后做一些基本的数据操作。

二、连接SQL Server

首先通过NuGet添加相关的包:

新建一个实体类:

  public class Product
    {
        [Key]
        public string Code { get; set; }
        public string Name { get; set; }
        public string Descript { get; set; }
        public int Numbers { get; set; }
    }

[Key]特性标识表明Code为主键。

新建一个DBContext类

public class SalesContext: DbContext
    {
        public DbSet<Product> Product { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder builder)
        {
            String connStr = "Server=localhost;Database=Sales;User Id=sales;Password=sales2018;";
            builder.UseSqlServer(connStr);
        }
    }

并在Startup中注册服务

public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<SalesContext>();
        }
    }

新建一个Controller,可以进行数据库的操作了

    [Produces("application/json")]
    [Route("api/products")]
    public class ProductsController : Controller
    {
        private readonly SalesContext _context;

        public  ProductsController(SalesContext context)
        {
            _context = context;
        }

        /// <summary>
        /// 获取产品列表
        /// </summary>
        /// <returns>产品列表</returns>
        [HttpGet]
        public List<Product> GetAllProducts()
        {
            List<Product> products = _context.Products.ToList<Product>();

            return products;
        }
    }

下面把数据库和表建好, 对于SQL Server,采用Windows身份认证登陆后,建数据库Sales和用户sales,进行相应权限设置后,确保可以通过SQL Server Management Studio以SQL Server认证的方式登陆数据库并可以进行数据操作。

数据库建表Product,字段名称、类型和实体类字段名称、类型一致:

所有实体类的属性在数据库都要有对应字段,但数据库表可以有多余的字段。

此时应该就可以通过 http://localhost:5000/api/products来查询数据了。

还有两个问题需要处理一下:

1、我们希望在Context中定义的实体DbSet的名称为Products而不是Product,同时希望数据库中对应的表名称为:Base_Product,这样更符合习惯。

 public class SalesContext: DbContext
    {
        public DbSet<Product> Products { get; set; }       

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>().ToTable("Base_Product");
        }
    }

2、我们的数据类连接字符串写在代码里了,需要把它移到配置文件里。

首先清空或删除DbContext类OnConfiguring的方法

 protected override void OnConfiguring(DbContextOptionsBuilder builder)
        {

        }

改为在Startup中读取配置文件

        public void ConfigureServices(IServiceCollection services)
        {
            String connStr = Configuration.GetConnectionString("SQLServerConnection");
            services.AddDbContext<SalesContext>(builder=> builder.UseSqlServer(connStr));
        }  

配置文件applicatios.json内容如下:

{
  "ConnectionStrings": {
    "SQLServerConnection": "Server=localhost;Database=Sales;User Id=sales;Password=sales2018;"
  }}

三、连接MySQL

1、增加包引用:

2、修改服务注册代码如下

public void ConfigureServices(IServiceCollection services)
        {
            String connStr = Configuration.GetConnectionString("MySQLConnection");
            services.AddDbContext<SalesContext>(builder=> builder.UseMySQL(connStr));
        }

配置文件信息如下:

{"MySQLConnection":"Server=58.220.197.198;port=3317;database=sales;uid=sales;pwd=sales;SslMode=None;"
}

因为默认采用SSL连接模式,如果数据库没有提供,需要增加SslMode=None

四、一些基本操作

    /// <summary>
    /// 产品信息接口
    /// </summary>
    [Produces("application/json")]
    [Route("api/products")]
    public class ProductsController : Controller
    {
        private readonly SalesContext _context;

        public  ProductsController(SalesContext context)
        {
            _context = context;
        }

        /// <summary>
        /// 获取产品列表
        /// </summary>
        /// <returns>产品列表</returns>
        [HttpGet]
        public List<Product> GetAllProducts()
        {
            List<Product> products = _context.Products.ToList<Product>();
            return products;
        }

        /// <summary>
        /// 根据产品编号查询产品信息(非模糊查询)
        /// </summary>
        /// <param name="code">产品编码</param>
        /// <returns>产品信息</returns>
        [HttpGet("{code}")]
        public Product GetProductByCode(String code)
        {
            Console.WriteLine($"GetProductByCode:code={code}");
            Product product = _context.Products.Find(code);
            return product;
        }   

        /// <summary>
        /// 新增产品
        /// </summary>
        /// <param name="product">产品信息</param>
        [HttpPost]
        public string  AddProduct([FromBody]Product product)
        {
            if(product==null)
            {
                Console.WriteLine("Add product : null");
                return null;
            }

            Console.WriteLine($"Add product :{product.Name}");
            _context.Products.Add(product);
            _context.SaveChanges();

            return "success";
        }        

        /// <summary>
        /// 删除产品
        /// </summary>
        /// <param name="code">编码</param>
        [HttpDelete("{code}")]
        public void Delete(string  code)
        {
            Console.WriteLine($"Delete product: code={code}");
            Product product = _context.Products.Find(code);
            if (product != null)
            {
                _context.Products.Remove(product);
                _context.SaveChanges();
            }           

            return;
        }

        /// <summary>
        /// 更新产品信息
        /// </summary>
        /// <param name="code">产品编码</param>
        /// <param name="newproduct">产品信息</param>
        [HttpPut("{code}")]
        public void Update(String code, [FromBody]Product newproduct)
        {
            Console.WriteLine($"Change product ({code}):Name={newproduct.Name}");
            Product product = _context.Products.Find(code);
            product.Name = newproduct.Name;

            _context.SaveChanges();
            return;
        }
    }

五、关于CodeFirst和DBfirst

很多教程都提到CodeFirst和DBfirst的操作,但我在实际使用中没有碰到这个应用场景,正常项目的研发一般都是建一些表写一些代码,再建一些表写一些代码,以此类推,很少有项目是真正把表全部建完再写代码的吧。

原文地址:https://www.cnblogs.com/seabluescn/p/9261492.html

时间: 07-01

循序渐进学.Net Core Web Api开发系列【8】:访问数据库(基本功能)的相关文章

循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇描述一些常用的数据库操作,包括:条件查询.排序.分页.事务等基本数据库操作.试验的数据库为MySQL. 二.条件查询1.查询所有记录 List<Article> articles = _context.Articles.ToList<Article>(); 2.根据主键进行查询 Articl

循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如何使用中间件(Middleware). 二.初步演练 先写几个中间件 public class DemoAMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public Dem

循序渐进学.Net Core Web Api开发系列【1】:开发环境

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇不打算描述如何通过Visual Studio创建一个项目之类的话题,主要描述以下内容: 1.使用NuGet和Bower引入第三方库 2.Linux下安装运行环境 3.关于安装虚拟机时碰到的网络设置的问题 实验环境:Windows 10 ,Visual Studio 2017 ,VM 14 , Cent

ASP.NET Core Web API 开发-RESTful API实现

REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representational State Transfer,简称REST)是Roy Thomas Fielding博士于2000年在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中提出来的一种万维网软件架构风格. 目前在三种主流的Web服务实现方案中,因为R

在Mac下创建ASP.NET Core Web API

在Mac下创建ASP.NET Core Web API 在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉及的内容相当全面,属于那种大而全的知识仓库,不太适合初学者,很容易让人失去重要,让人掉入到具体的细节之中. 对于大多数人来讲开发语言只是工具,程序员都有一个通病,就是死磕工具,把工具学深.我认为在工具上没有必要投入太多时间,以能高效地完成日常的

ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,并对接收到的消息进行处理,于此同时,它还能够向该渠道发送事件消息,以便订阅该事件消息的消费者能够对消息数据做进一步处理.让我们回顾一下微服务之间通信的几种方式,分为同步和异步两种.同步通信最常见的就是RESTful API,而且非常简单轻量,一个Request/Resp

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

 一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自己的职业发展还是很有帮助的.毕竟,现在都快到9102年了,如果你还是只会 Web Form,或许还是能找到很多的工作机会,可是,这真的不再适应未来的发展了.如果你准备继续在 .NET 平台下进行开发,适时开始拥抱开源,拥抱 ASP.NET Core,即使,现在工作中可能用不到. 雪崩发生时,没有一

asp.net core web api token验证和RestSharp访问

对与asp.net core web api验证,多种方式,本例子的方式采用的是李争的<微软开源跨平台移动开发实践>中的token验证方式. Asp.net core web api项目代码: 首先定义三个Token相关的类,一个Token实体类,一个TokenProvider类,一个TokenProviderOptions类 代码如下: /// <summary> /// Token实体 /// </summary> public class TokenEntity