美文网首页.NETASP.NET Core见识录ASP.NET WEB API
Asp.netCore3.0 WebApi从0到1手摸手教你写【

Asp.netCore3.0 WebApi从0到1手摸手教你写【

作者: 我是Mr小赵先生 | 来源:发表于2019-10-16 11:29 被阅读0次

    今天要增加一个通过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类库----ModelsBoCommon
    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

    相关文章

      网友评论

        本文标题:Asp.netCore3.0 WebApi从0到1手摸手教你写【

        本文链接:https://www.haomeiwen.com/subject/nngjmctx.html