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)的更多相关文章

  1. 基于.Net Core的API框架的搭建(1)

    目标 我们的目标是要搭建一个API控制器的项目,API控制器提供业务服务. 一.开发框架搭建 1.开发前准备 开发前,我们需要下载如下软件,安装过程略: (1) 开发工具:VS2017 (2) 数据库 ...

  2. 基于.Net Core的API框架的搭建(4)

    6.加入日志功能 日志我们选用log4net,首先引入程序包: 选择2.0.8版本安装.然后在项目根目录新增log4net的配置文件log4net.config: <?xml version=& ...

  3. 基于.Net Core的API框架的搭建(3)

    5.加入缓存支持 我们希望为项目增加缓存支持,我们选择Redis做为缓存数据库. 首先,我们在Services目录增加一个缓存接口类ICacheService: using System; using ...

  4. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  5. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...

  6. 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

    0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...

  7. 基于.net core 2.0+mysql+AceAdmin搭建一套快速开发框架

    前言 .net core已经出来一段时间了,相信大家对.net core的概念已经很清楚了,这里就不再赘述.笔者目前也用.net core做过一些项目,并且将以前framework下的一些经验移植到了 ...

  8. Ocelot——初识基于.Net Core的API网关

    前言 前不久看到一篇<.NET Core 在腾讯财付通的企业级应用开发实践>,给现在研究.Net Core及想往微服务方向发展的人来了一剂强心针.于是我也就立刻去下Ocelot的源码及去阅 ...

  9. 一个轻量级的基于 .NET Core 的 ORM 框架 HSQL

    HSQL 是一种轻量级的基于 .NET Core 的数据库对象关系映射「ORM」框架 HSQL 是一种可以使用非常简单且高效的方式进行数据库操作的一种框架,通过简单的语法,使数据库操作不再成为难事.目 ...

随机推荐

  1. 61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】

    mybatic insert异常:BindingException: Parameter 'name' not found [从零开始学习Spirng Boot-常见异常汇总] 异常信息如下: nes ...

  2. [luoguP2709] 小B的询问(莫队)

    传送门 个数 1 2 3 4 5 答案 1 4 9  16 25 做差 1 3 5 7 9 显然增加一个数只需要增加 ton[a[x]] << 1 | 1 即可 减去一个数也减去这个 注意 ...

  3. MTK平台添加防止误触代码

    ltr559_old: #include <linux/interrupt.h> #include <linux/i2c.h> #include <linux/slab. ...

  4. POJ 2686_Traveling by Stagecoach【状态压缩DP】

    题意: 一共有m个城市,城市之间有双向路连接,一个人有n张马车票,一张马车票只能走一条路,走一条路的时间为这条路的长度除以使用的马车票上规定的马车数,问这个人从a出发到b最少使用时间. 分析: 状态压 ...

  5. list去重精简代码版

    List<String> list = new ArrayList<>(); list.add("111"); list.add("111&quo ...

  6. Hibernate自定义简单主键生成

    Hibernate自定义主键生成 当使用Hibernate定义pojo的时候,有时候需要生成一定规则的数据表主键,这时候我们可以采用自定义主键生成方式去生成主键. 例如: 1.在pojo属性中定义数据 ...

  7. CodeIgniter 向mysql插入数据包括字母、汉字问题

    今天在使用ci框架,须要向mysql数据表插入数据.当中的一个字段包括汉字.字母.但是用传统的使用sql语句:insert into XXX这样的方式,不管怎样都插入不成功,最后我换了还有一种方式: ...

  8. org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not

    遇到这个问题之前,我去百度和谷歌去搜索了一下.发现各种说法.可是针对我的项目而言,也就是公司的项目而言,这个问题的根源并不是是网上所说的那样. 最后是通过自己的想法做測试得到了解决. 1.首先说说我的 ...

  9. 10.11无法打开Xcode6.4的解决方法

    前言 mac升级到10.11版本号并安装Xcode7.0Beta之后,Dock中的Xcode6.3图标上出现一个禁止符号,打开提示到App store更新最新版本号,更新到6.4之后问题依然,还是提示 ...

  10. 编程算法 - 最小的k个数 代码(C)

    最小的k个数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出当中的最小k个数. 使用高速排序(Quick Sort)的方法 ...