• 循序渐进学.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的操作,但我在实际使用中没有碰到这个应用场景,正常项目的研发一般都是建一些表写一些代码,再建一些表写一些代码,以此类推,很少有项目是真正把表全部建完再写代码的吧。

  • 相关阅读:
    ELK日志分析系统
    amoeba_mysql 读写分离
    while for if ---语句和编写计划任务
    Shell awk文本处理,shell脚本编写
    shell---正则表达式和文本处理器
    linux---网络相关配置,ssh服务,bash命令及优先级,元字符
    linux---nginx服务nfs服务nginx反向代理三台web
    linux---进程,(rpm,yum)软件包
    linux---tar命令,vim编辑器,磁盘分区,挂载,链接
    linux命令权限
  • 原文地址:https://www.cnblogs.com/seabluescn/p/9261492.html
Copyright © 2020-2023  润新知