系列目錄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的操做,但我在實際使用中沒有碰到這個應用場景,正常項目的研發通常都是建一些表寫一些代碼,再建一些表寫一些代碼,以此類推,不多有項目是真正把表所有建完再寫代碼的吧。