按部就班学.Net Core Web Api开发系列【8】:访问数据库(基本功能)

系列目录html

按部就班学.Net Core Web Api开发系列目录ios

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

 

1、概述github

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

 

2、链接SQL Serverjson

首先经过NuGet添加相关的包:api

 

新建一个实体类:app

  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为主键。ide

 

新建一个DBContext类ui

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来查询数据了。

 

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

一、咱们但愿在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");
        }
    }

 

二、咱们的数据类链接字符串写在代码里了,须要把它移到配置文件里。

首先清空或删除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;"
  }
}

 

3、链接MySQL

一、增长包引用:

二、修改服务注册代码以下

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

 

4、一些基本操做

    /// <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;
        }
    }

 

5、关于CodeFirst和DBfirst

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

相关文章
相关标签/搜索