今天要增加一個通過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加密解密等。
創建類庫具體步驟如下圖:
創建好類庫以后可以把里面的
Class1.cs
直接刪除添加完類庫以后進行類庫的關聯,
AP
I引用Models
+Bo
+Common
,Bo
引用Models
+Common
3個類庫創建完畢以后整個工程目錄如下:
然后給每個項目添加EF相關的Nuget包,每個類庫要添加的包如下:
這個項目有點.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
自動把數據庫連接字符串寫在項目中了,這樣不便于后期維護,推薦寫在配置文件中。
第四步配置數據庫連接字符串
- 在XXX.api項目中找到
appsettings.json
文件增加數據庫連接字符串
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"xxxDB": "Server=服務器地址;User Id=數據庫登錄名;Password=密碼;Database=數據庫名稱;"
}
}
- 在XXX.api項目中找到
Startup.cs
文件獲取數據庫連接字符串
也可以通過services.AddDbContext<Models.XXXEntities.xxxContext>(options => { options.UseSqlServer(conn); });
注冊數據庫連接字符串,但是EF的實體類放在了Models中不知道為什么這樣寫總提示沒有配置數據庫,于是改成了通過一個全局變量來設置數據庫連接字符串的方式。
關于EF相關的寫完了,下面開始寫一個接口。
第五步定義接口
- 在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
- 在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輸入測試數據和接口地址,紅框里是需要注意的內容
我們打個斷點查看下webapi接收到的數據
第一次提交返回結果
第二次提交返回結果
通過這2個教程基本上就掌握如何用NetCore寫一個webapi了,不過接口寫好了是不是該提供一份棒棒的接口文檔呢?答案必須是YES,下一個教程將帶你去給接口生成一個棒棒的接口文檔。
補充
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; }
}
}