基于.Net Core的API框架的搭建(2)
4、加入数据库支持
下面我们为项目加入数据库支持,修改appsettings.json:
然后我们要生成实体类,打开VS工具->NuGet包管理器->程序包管理器控制台:
输入命令:
Scaffold-DbContext "server=.;userid=root;pwd=root;port=3306;database=chainstore;sslmode=none;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force |
回车执行时会提示错误:
是因为我们没有引入MySQL的支持包,我们在依赖项上点击鼠标右键,选择“管理NuGet程序包”:
注意,程序包源要切换为:nuget.org
然后我们搜索:entityframeworkcore
选择Microsoft.EntityFrameworkCore,目前最新版本是2.2.4,但由于我们Microsoft.AspNetCore.App版本是2.1.1的,需要 Microsoft.EntityFrameworkCore (>= 2.1.1 && < 2.2.0),所以我们选择2.1.8版本,点安装按钮进行安装。
然后再搜索关键字:mysql:
选择Pomelo.EntityFrameworkCore.MySql,目前最新版本是2.2.0,同样由于Microsoft.AspNetCore.App版本所限,我们只能使用2.1.4版本,点安装按钮进行安装。
然后,我们再返回程序包管理器控制台,重新执行上次的命令:
好,这次成功了,我们看到Models目录多了两个文件:
打开chainsotreContext.cs,我们将OnConfiguring方法删除,引为我们要在配置文件中配置MySQL的连接字符串,而不是直接写到类中:
然后解决一个命名规则冲突:
C#建议的类名为大写字母开头,而自动生成的类为小写字母,我们直接点“解决名称冲突”解决一下就好了。
然后我们打开Startup.cs,引入MySql连接字符串配置:
public void ConfigureServices(IServiceCollection services) { string MysqlConnectionString = Configuration.GetConnectionString("MysqlConnectionString"); services.AddDbContext<ChainstoreContext>(opt => opt.UseMySql(MysqlConnectionString)); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } |
我们希望增加一个基础控制器类,在其中进行一些基本的控制,比如:检查请求是否合法,防御基本的攻击等,因此我们增加一个BaseController类:
代码如下:
public class BaseController : ControllerBase { public readonly ChainstoreContext context; public BaseController(ChainstoreContext _context) { this.context = _context; } } |
相同的方法,我们再增加一个包含读写操作的测试控制器类TestController:
注意修改此类继承自BaseController,增加构造函数继承父类构造函数。
我们想让所有的控制器类返回统一格式的JSON字符串,所以新建一个自定义模型类ResultInfo:
增加四个字段:Code、Message、Data、CurrentTime
public class ResultInfo { public string Code { get; set; } public string Message { get; set; } public object Data { get; set; } public DateTime CurrentTime { get; set; } = DateTime.Now; } |
Code:返回当前操作代码,0为成功
Message:返回当前操作提示信息
Data:返回当前操作相关数据
CurrentTime:返回当前服务器时间戳
然后,修改测试控制器类:
查询:
// GET: api/Test [HttpGet] public ResultInfo Get() { try { var result = context.TMember.Where(n => n.Id > 0); if (null != result && result.Count() > 0) { return new ResultInfo() { Code = "0", Message = "成功", Data = result }; } else { return new ResultInfo() { Code = "100002", Message = "未找到相应会员" }; } } catch (Exception e) { return new ResultInfo() { Code = "100001", Message = "查询会员失败:" + e.Message }; } } // GET: api/Test/5 [HttpGet("{id}", Name = "Get")] public ResultInfo Get(int id) { try { var result = context.TMember.Where(n => n.Id > 0); if (null != result && result.Count() > 0) { var member = result.First(); return new ResultInfo() { Code = "0", Message = "成功", Data = member }; } else { return new ResultInfo() { Code = "100002", Message = "未找到相应会员" }; } } catch (Exception e) { return new ResultInfo() { Code = "100001", Message = "查询会员失败:" + e.Message }; } } |
增加:
// POST: api/Test [HttpPost] public ResultInfo Post([FromBody] TMember member) { try { member.GradeId = 1; member.Status = 1; member.Creator = "self"; member.CreateTime = DateTime.Now; context.TMember.Add(member); context.SaveChanges(); return new ResultInfo() { Code = "0", Message = "成功", Data = member }; } catch (Exception e) { return new ResultInfo() { Code = "100003", Message = "新增会员失败:" + e.Message, Data = member }; } } |
修改:
// PUT: api/Test/5 [HttpPut("{id}")] public ResultInfo Put(int id, [FromBody] TMember member) { if (id != member.Id) { return new ResultInfo() { Code = "100004", Message = "会员ID不一致" }; } try { var result = context.TMember.Where(n => n.Id == id); if (null != result && result.Count() > 0) { var editMember = result.First(); editMember.UserName = member.UserName; editMember.Password = member.Password; editMember.Name = member.Name; editMember.Sex = member.Sex; editMember.Birthday = member.Birthday; editMember.MaritalStatus = member.MaritalStatus; editMember.GradeId = member.GradeId; editMember.Address = member.Address; editMember.Phone = member.Phone; editMember.Status = member.Status; editMember.Modifier = member.Modifier; context.TMember.Update(editMember); context.SaveChanges(); return new ResultInfo() { Code = "0", Message = "成功", Data = editMember }; } else { return new ResultInfo() { Code = "100006", Message = "会员不存在" }; } } catch (Exception e) { return new ResultInfo() { Code = "100005", Message = "更新会员失败:" + e.Message, Data = member }; } } |
删除:
// DELETE: api/ApiWithActions/5 [HttpDelete("{id}")] public ResultInfo Delete(int id) { try { //删除会员 var members = context.TMember.Where(n => n.Id == id); if (null != members && members.Count() > 0) { context.TMember.RemoveRange(members); context.SaveChanges(); return new ResultInfo() { Code = "0", Message = "成功", Data = id }; } else { return new ResultInfo() { Code = "100008", Message = "此会员不存在", Data = id }; } } catch (Exception e) { return new ResultInfo() { Code = "100007", Message = "删除会员失败:" + e.Message, Data = id }; } } |
错误代码我们做一下规定,前四位为控制器代码(1000),后两位为具体错误代码(01)。
现在我们运行一下看看效果:
OK,是我们想要的效果,现在会员表里没有数据,所以找不到相应会员,现在我们用Postman添加一条试试:
注意上图中红框中的项,点“Send”按钮,可以看到提交结果:
然后查看数据库:
测试POST成功,数据成功添加到数据库。
然后我们再GET一下看看是否能取到刚才添加的会员:
可以,成功返回了。
再测试一下删除:
数据库中已经没有了,成功删除:
基于.Net Core的API框架的搭建(2)的更多相关文章
- 基于.Net Core的API框架的搭建(1)
目标 我们的目标是要搭建一个API控制器的项目,API控制器提供业务服务. 一.开发框架搭建 1.开发前准备 开发前,我们需要下载如下软件,安装过程略: (1) 开发工具:VS2017 (2) 数据库 ...
- 基于.Net Core的API框架的搭建(4)
6.加入日志功能 日志我们选用log4net,首先引入程序包: 选择2.0.8版本安装.然后在项目根目录新增log4net的配置文件log4net.config: <?xml version=& ...
- 基于.Net Core的API框架的搭建(3)
5.加入缓存支持 我们希望为项目增加缓存支持,我们选择Redis做为缓存数据库. 首先,我们在Services目录增加一个缓存接口类ICacheService: using System; using ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...
- 基于.net core 2.0+mysql+AceAdmin搭建一套快速开发框架
前言 .net core已经出来一段时间了,相信大家对.net core的概念已经很清楚了,这里就不再赘述.笔者目前也用.net core做过一些项目,并且将以前framework下的一些经验移植到了 ...
- Ocelot——初识基于.Net Core的API网关
前言 前不久看到一篇<.NET Core 在腾讯财付通的企业级应用开发实践>,给现在研究.Net Core及想往微服务方向发展的人来了一剂强心针.于是我也就立刻去下Ocelot的源码及去阅 ...
- 一个轻量级的基于 .NET Core 的 ORM 框架 HSQL
HSQL 是一种轻量级的基于 .NET Core 的数据库对象关系映射「ORM」框架 HSQL 是一种可以使用非常简单且高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事.目 ...
随机推荐
- two strings
A1484. two strings(罗干) 时间限制:1.0s 内存限制:256.0MB [问题描述] 给定两个字符串A和B,有五种操作,操作1为在A串开头添加一个字符,操作2为在A串结尾添加一 ...
- noip模拟赛 道路分组
分析:因为每一组编号都是连续的嘛,所以能分成一组的尽量分,每次加边后dfs判断一下1和n是否连通.有向图的判连通没有什么很快的方法,特别注意,并查集是错的!这个算法可以得到60分. 事实上每一次都不需 ...
- [K/3Cloud] 关于单据转换的问题
1. 单据转换,是否支持重复下推,支持新增下推和更新下推? 答:支持重复下推,是否允许下推受以下因素: 1).源分录是否是有效状态(源单单头状态会自动影响分录,下同),例如已审核.未关闭.未作废: 2 ...
- [HDU5709]Claris Loves Painting(动态开点线段树+合并)
题意:有n(<=1e5)个点的树,每个点都有颜色(颜色可能重复),有m(<=1e5)个询问,每次询问(x,d)问在x的子树中,与x的距离不超过d的节点有多少种不同的颜色.强制要求在线. 分 ...
- Restful 级别划分以及HATEOAS是什么?
Restful简介 Rest是一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存 ...
- JSTL-格式标签库
主页:http://www.cnblogs.com/EasonJim/p/6958992.html的分支页. 一.<fmt:formatNumber> <fmt:formatNumb ...
- jQuery源代码解析(1)—— jq基础、data缓存系统
闲话 jquery 的源代码已经到了1.12.0版本号.据官网说1版本号和2版本号若无意外将不再更新,3版本号将做一个架构上大的调整.但预计能兼容IE6-8的.或许这已经是最后的样子了. 我学习jq的 ...
- Python标准库:内置函数tuple([iterable])
本函数实现从可迭代对象生成一个元组对象返回.元组对象是一个不可改动的列表对象. 样例: #tuple() print(tuple([1, 2, 3])) print(tuple((1, 2, 3))) ...
- 基于cocos2d-x-3.2学习Box2D(一)
cocos版本号:cocos2d-x-3.2 环境:Win7+VS2013 因为一些太底层的实现我如今的能力学习不到,仅仅能做一些简单的笔记,供以后翻阅.假设别人可以得到帮助,莫大的荣幸. 一.创建世 ...
- 静态链表的C++实现
静态链表是使用数组实现的能够高速插入和删除数据的链表,静态链表和链式单链表比的缺点在于链表的长度仅仅能初始化设置好,而相相应普通的顺序存储的链表,静态链表不能实现高速的读写随意的元素. 当然静态链表给 ...