系列目录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的操做,但我在实际使用中没有碰到这个应用场景,正常项目的研发通常都是建一些表写一些代码,再建一些表写一些代码,以此类推,不多有项目是真正把表所有建完再写代码的吧。