1. 程式人生 > >循序漸進學.Net Core Web Api開發系列【8】:訪問資料庫(基本功能)

循序漸進學.Net Core Web Api開發系列【8】:訪問資料庫(基本功能)

系列目錄

一、概述

本篇討論如何連線資料庫,包括連線SQL Server 和 連線MySQL,然後做一些基本的資料操作。

二、連線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,欄位名稱、型別和實體類欄位名稱、型別一致:

所有實體類的屬性在資料庫都要有對應欄位,但資料庫表可以有多餘的欄位。

此時應該就可以通過 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");
        }
    }

2、我們的資料類連線字串寫在程式碼裡了,需要把它移到配置檔案裡。

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

三、連線MySQL

1、增加包引用:

2、修改服務註冊程式碼如下

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

四、一些基本操作

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

五、關於CodeFirst和DBfirst

 很多教程都提到CodeFirst和DBfirst的操作,但我在實際使用中沒有碰到這個應用場景,正常專案的研發一般都是建一些表寫一些程式碼,再建一些表寫一些程式碼,以此類推,很少有專案是真正把表全部建完再寫程式碼的吧。