Asp.netCore3.0 WebApi從0到1手摸手教你寫【2】通過EF訪問數據庫

今天要增加一個通過EF訪問數據庫的功能,同時寫一個增加新用戶的接口,
接口訪問地址:api/User/AddUser
接口入參:{ "phone":"13200000000", "password":"123456", "nickName":"小趙先生", "state":1 }
接口返回值:{ "code": 1, "message": "數據插入成功" }

開發環境

Visual Studio 2019
.net core 3.0
Sqlserver 2008數據庫
Postman

第一步創建類庫

教程一的基礎上首先新增3個.NET Core類庫----Models、Bo、Common
Models:存放EF的一些實體類,EF的DBContent和接口傳參Model以及接口返回值Model等一切和對象有關的統統放這里。
Bo:這里主要處理業務層面的事情,比如將用戶信息存放到數據庫。
Common:主要是一些公共類,比如圖片上傳、Md5簽名、DES加密解密等。
創建類庫具體步驟如下圖:

01

02

03

創建好類庫以后可以把里面的Class1.cs直接刪除
04

添加完類庫以后進行類庫的關聯,API引用Models+Bo+CommonBo引用Models+Common
05

3個類庫創建完畢以后整個工程目錄如下:
項目目錄

然后給每個項目添加EF相關的Nuget包,每個類庫要添加的包如下:


EF包添加

這個項目有點.Net三層架構的意思,沒有用工場模式,解耦方面也沒有特別的考慮,優點就是簡單、清晰、一目了然,可以滿足小型和中型項目,做個后臺管理系統接口或者手機APP接口完全沒有問題。

第二步創建一個數據庫

一個EF項目的開始總會有人在思考到底DBFirs還是CodeFirst,個人還是比較喜歡DBFirst,數據庫設計好了,剩下的項目代碼其實90%以上就是數據庫的增刪改查操作了,所以這個教程也是采用的DBFirst模式。
數據庫怎么創建就不寫教程了,直接給代碼:
數據庫名稱:xxx
表名稱:User
表創建代碼如下:

CREATE TABLE [dbo].[User](
    [id] [int] IDENTITY(1,1) NOT NULL,--一個自動增長的主鍵
    [phone] [varchar](20) NULL,--用戶手機號
    [password] [nvarchar](50) NULL,--用戶密碼
    [msgCode] [varchar](10) NULL,--用戶最新一次獲取的短信驗證碼
    [regTime] [datetime] NULL,--用戶注冊時間
    [nickName] [nvarchar](50) NULL,--用戶昵稱
    [state] [int] NULL,--用戶狀態
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

注:此處應該說一句,不推薦給表起名User,User在sqlserver中屬于關鍵詞,所以在寫sql語句的時候要把User表名括起來,比如:select * from [User]

第三步EF相關代碼

在Models中XXXEntities中新建2個類,一個表User實體類User.cs和DbContext類xxxContext.cs


User.cs代碼如下:

using System;

namespace XXX.Models.XXXEntities
{
    public partial class User
    {
        public int Id { get; set; }
        public string Phone { get; set; }
        public string Password { get; set; }
        public string MsgCode { get; set; }
        public DateTime? RegTime { get; set; } //此處的問號表示RegTime允許為空
        public string NickName { get; set; }
        public int? State { get; set; }
    }
}

xxxContext.cs代碼如下:

using Microsoft.EntityFrameworkCore;

namespace XXX.Models.XXXEntities
{
    public partial class xxxContext : DbContext
    {
        public xxxContext()
        {
        }

        public xxxContext(DbContextOptions<xxxContext> options)
            : base(options)
        {
        }

        public virtual DbSet<User> User { get; set; }
        public static string ConStr { get; set; }//用于接收數據庫連接字符串
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(ConStr);//設置數據庫連接字符串
            }
        }
    }
}

注:如果數據庫表非常多,手寫數據庫表實體類是一件非常煩躁且容易出錯的事情,所以可以使用命令自動生成。
1.打開程序包管理器控制臺

操作步驟

控制臺界面如下:
控制臺界面

2.在控制臺輸入命令代碼,默認項目要選擇xxx.Models這樣才能把代碼生成到Models里面
Scaffold-DbContext "Server=服務器地址;User Id=用戶名;Password=密碼;Database=數據庫名稱;" Microsoft.EntityFrameworkCore.SqlServer -o XXXEntities -f -t StateMgr
注意事項

注釋:
-o 后面指定文件夾,
-f 表示是否覆蓋原文件
-t 后面跟表名
默認生成的xxxContext.cs自動把數據庫連接字符串寫在項目中了,這樣不便于后期維護,推薦寫在配置文件中。

OnConfiguring

第四步配置數據庫連接字符串

  1. 在XXX.api項目中找到appsettings.json文件增加數據庫連接字符串
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "xxxDB": "Server=服務器地址;User Id=數據庫登錄名;Password=密碼;Database=數據庫名稱;"
  }
}
  1. 在XXX.api項目中找到Startup.cs文件獲取數據庫連接字符串

    也可以通過services.AddDbContext<Models.XXXEntities.xxxContext>(options => { options.UseSqlServer(conn); });注冊數據庫連接字符串,但是EF的實體類放在了Models中不知道為什么這樣寫總提示沒有配置數據庫,于是改成了通過一個全局變量來設置數據庫連接字符串的方式。
    關于EF相關的寫完了,下面開始寫一個接口。

第五步定義接口

  1. 在XXX.Bo中新建一個UserBo.cs
using System.Linq;

namespace XXX.Bo
{
    public class UserBo
    {
        public static Models.XXXEntities.xxxContext db = new Models.XXXEntities.xxxContext();
        /// <summary>
        /// 增加一個用戶數據
        /// </summary>
        /// <param name="model"></param>
        public static Models.User.AddUserR AddUser(Models.User.AddUserP model)
        {
            
            var r = new Models.User.AddUserR();
            Models.XXXEntities.User userSearch = (from u in db.User where u.Phone == model.phone select u).FirstOrDefault();
            if (userSearch==null)
            {
                Models.XXXEntities.User user = new Models.XXXEntities.User();
                user.Phone = model.phone;
                user.Password = model.password;
                user.NickName = model.nickName;
                user.State = model.state;
                db.User.Add(user);
                int i =db.SaveChanges();
                if (i>0)
                {
                    r.code = 1;
                    r.message = "數據插入成功";
                }
                else
                {
                    r.code = 0;
                    r.message = "數據插入成功";
                }
            }
            else
            {
                r.code = 0;
                r.message = "手機號已經存在";
            }
            return r;
        }
    }
}
//EF我是用Linq的方式寫的,所以using只引用了System.Ling
  1. 在XXX.api中UserController.cs增加一個接口
        /// <summary>
        /// 增加一個用戶
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AddUser([FromBody]Models.User.AddUserP model)
        {
            var r = Bo.UserBo.AddUser(model);
            return Ok(r);
        }

第六步測試

接口寫好了,程序員要自己測試下代碼,這是一個非常好的習慣,要從寫第一行代碼開始就要養成,我們測試下
打開postman輸入測試數據和接口地址,紅框里是需要注意的內容


image.png

我們打個斷點查看下webapi接收到的數據


post數據接收

第一次提交返回結果
結果1

第二次提交返回結果
結果2

通過這2個教程基本上就掌握如何用NetCore寫一個webapi了,不過接口寫好了是不是該提供一份棒棒的接口文檔呢?答案必須是YES,下一個教程將帶你去給接口生成一個棒棒的接口文檔。

補充

Models類庫

Models

注:P結尾的model表示參數實體對象,R結尾的model表示返回結果實體對象
AddUserP.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace XXX.Models.User
{
    public class AddUserP
    {
        public string phone { get; set; }
        public string password { get; set; }
        public string nickName { get; set; }
        public int state { get; set; }
        public string sign { get; set; }
    }
}

AddUserR.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace XXX.Models.User
{
    public class AddUserR
    {
        public int code { get; set; }
        public string message { get; set; }
    }
}

項目源碼地址

https://github.com/xiaxiaoqian/NetCore3.0-WebApi

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容