访问数据库(基本功能)

本篇概述

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

1 连接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,字段名称、类型和实体类字段名称、类型一致:

使用场景

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

  数据库建表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");
    }
}
  1. 我们的数据类连接字符串写在代码里了,需要把它移到配置文件里。

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

2 连接MySQL

  1. 增加包引用:

使用场景

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

版权声明: 本文为智客工坊「seabluescn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""