iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

C# 從入門到WebApi系列 第 27

[Day27] 用ORM進行資料庫操作

  • 分享至 

  • xImage
  •  

繼續昨天的話題吧

我們一樣打開我們的專案
我們先把List<Product> products 刪除
然後清空GetProduct 跟 CreateProduct兩個方法的程式碼
順便將前天範例的CreateProduct方法的[FromQuery]刪掉

所以目前程式碼會像

ProductControlle.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MyFirstApi.Model;
using Newtonsoft.Json;

namespace MyFirstApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ProductController : ControllerBase
    {
        [HttpGet]
        [Route("GetProduct")]
        public List<Product> GetProducts()
        {
        }

        [HttpPost]
        [Route("CreateProduct")]
        public string CreateProduct(Product product)
        {
        }
    }
}

刪完之後會出現紅色小蚯蚓是正常的
兩個方法都有要求返回值
但我們並沒有return任何東西

查詢

接著我們在GetProducts程式碼中填入

[HttpGet]
[Route("GetProduct")]
public List<Product> GetProducts()
{
      using (ProductContext context = new ProductContext())
      {
            return context.Products.ToList();
      }
}

第一行的using ProductContext context = new ProductContext();
指的是在這個區塊的程式碼執行完成之後
context這個物件就會從記憶體中被釋放

通常對於DB連線或者是WebClient連線等等的方式
因為DB在處理系統的連線數是有限的
所以我們要確保在執行完動作之後馬上釋放連線
才能夠讓DB處理更多請求

我們先讓CreateProduct 回傳空值

        [HttpPost]
        [Route("CreateProduct")]
        public string CreateProduct(Product product)
        {
            return null;
        }

然後執行專案
一樣用POST去呼叫 GetProduct
https://ithelp.ithome.com.tw/upload/images/20200927/20109549I1d61yI1qg.png

因為資料庫裏面沒有東西
所以我們得到空的List

新增

所以我們來實作CreateProduct

        [HttpPost]
        [Route("CreateProduct")]
        public string CreateProduct(Product product)
        {
            using ProductContext context = new ProductContext();
            context.Products.Add(product);
            context.SaveChanges();
            return $"{JsonConvert.SerializeObject(product)}商品已加入清單";
        }

context指的是你的資料庫
products 是資料庫中的資料表
我們在資料表中加入了一筆product

但是在執行context.SaveChanges();之前
通通都只是在記憶體中
直到我們執行這行才會把所有變更存到資料庫中

我們一樣執行專案
然後一樣用PostMan測試
https://ithelp.ithome.com.tw/upload/images/20200927/20109549PCegMSwSvu.png

可以看見成功訊息
我們再用GetProducts看看
https://ithelp.ithome.com.tw/upload/images/20200927/20109549uSHrPId5wx.png
可以成功地看見物品清單

有了新增查詢
接著我們來實作修改與刪除

修改

我們先新增一個修改的方法

[HttpPut]
[Route("UpdateProduct/{id}")]
public ActionResult CreateProduct(string id,[FromBody]Product product)
{
      using ProductContext context = new ProductContext();
      Product originProduct = context.Products.FirstOrDefault(x => x.Id == id);
      if (originProduct == null) return BadRequest("if not found");
      if (product.Id != id) return BadRequest("不可修改ID");

      originProduct.Name = product.Name;
      originProduct.Price = product.Price;
      originProduct.Origin = product.Origin;
      context.SaveChanges();
      return Ok($"{JsonConvert.SerializeObject(originProduct)}已被修改}");
}

[Route("UpdateProduct/{id}")]
{id}表示這是必填欄位
他為綁定到傳入參數中的id

Product originProduct = context.Products.FirstOrDefault(x => x.Id == id);
if (originProduct == null) return BadRequest("if not found");
if (product.Id != id) return BadRequest("不可修改ID");

這三行是從根據ID從資料庫中找到要修改的資料
如果找不到資料就回傳 BadRequest
通常ID是不會被修改的
他通常是資料庫的主鍵
所以要修改的ID跟原本資料的ID對不上的話我也會回傳BadRequest
不熟HttpCode可以參考
https://ithelp.ithome.com.tw/articles/10242055

剩下就是進行修改的動作
當然我們也可以把資料刪掉再塞一筆新的進去假裝他被修改了
不過外部使用者只要在乎資料有被修改
不用在乎你實作的細節
這就是封裝的重要性

我們一樣執行專案
在網址列輸入
https://localhost:5001/api/product/updateproduct/F001
F001是我上面示範的商品編號
記得將方法改為PUT

https://ithelp.ithome.com.tw/upload/images/20200927/20109549HJ59DEmVqy.png

然後我們用GetProduct
可以看見物品確實被修改了
https://ithelp.ithome.com.tw/upload/images/20200927/20109549jZX33ZfMcu.png

刪除

我們再建立一個DeleteProduct Method

        [HttpDelete]
        [Route("DeleteProduct/{id}")] 
        public ActionResult DeleteProduct(string id)
        {
            using ProductContext context = new ProductContext();
            Product originProduct = context.Products.FirstOrDefault(x => x.Id == id);
            if (originProduct == null) return BadRequest("if not found");

            context.Products.Remove(originProduct);
            context.SaveChanges();
            return Ok($"{JsonConvert.SerializeObject(originProduct)}已被刪除");
        }

一樣開啟專案測試
網址輸入https://localhost:5001/api/product/deleteproduct/F001
https://ithelp.ithome.com.tw/upload/images/20200927/2010954970Z8e1DCRg.png

物品被刪了
Get
https://ithelp.ithome.com.tw/upload/images/20200927/20109549wJu3L85a8k.png

神摸也沒有

原始程式碼(https://github.com/peace920902/ApiTutorial)


上一篇
[Day26] 使用EF Core來建立資料庫
下一篇
[Day28] 模型驗證
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言