.NET WebApi 实战第二讲之使用EF实现接口查询
上一讲,我们已经创建了Web Api的基础框架,已经可以通过HTTP进行简单的访问及简单的数据处理。但是在实际的场景中,一个系统的业务逻辑没有这么简单和单调,它总是伴随着更多的逻辑、更多的业务、更复杂的关联关系。所有的数据都是保存在数据库中(SQLSERVER、mysql、mongodb等),你把数据库就理解为一个数据保存的文件系统就行了,它比我们普通的文件系统拥有更高的访问效率和性能、它有事务、它有锁、它有自己的一套CRUD语句等特点。
这里延伸一下,什么是事务,什么是锁,什么是CRUD。注意这里不照搬官方的定义,我只用白话和更简单地易于理解的描述让大家有更好的认识及理解。
事务:做一连串有序的事情(或一个事情),当其中一个出现异常时,已经被执行的命令进行回退还原。比如,你有ABCD4个事情加入到事务中,修改了A里面的一个原始值为1的值变为2,修改了B里面的一个原始值为2的值变为3,但是当执行C事情的时候,出现错误,无法继续执行,则所有已经在此事务中处理的全部回退还原。即:A中的值还原为1,B中的值还原为2.这种应用场景在大型电商或者是严谨的系统中是必须保证数据正确的。否则出现数据方面的错误,整个系统就无法正常工作了,后期产生的数据全部都是错的,系统就没有生存的意义了。
锁:有一堆人都想去使用同一辆小汽车,他们从四面八方赶往停车场去使用这辆车,必须有一个人先到先占有使用,这个人未使用完前,其他任何人是无法使用的,如果你想要使用,就等,等先到的那个人使用完毕后,你才能接着使用。同样,下一个正在使用的人完全占据了此物的使用权,其他人得接着等!开始使用时,相当于是加锁。使用完毕就是解锁。只有解锁了,其它人才有资格进行使用、即再次加锁。如果已经加了锁,其它人无法解锁无法使用。
CRUD:这个是数据库方面常用语句的简称。create、read、update、delete的简称而已。read就是特指Select语句,属于读操作。
在进行进一步实战之前,我们得先准备好环境,得在你电脑上安装好数据库,此实战教程以微软的Sqlserver为基础进行演示。
安装教程网上一堆,这里就不一一演示及讲解了。同学们自己搜索安装使用,安装过程中设置的密码信息什么的,都记住即可。这里提供一个官网的下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
准备好数据库环境后,我们需要创建数据库及表。这里说一下,由于历史及工作原因,我使用的是SQLSERVER 2008R2版本,你安装的是最新版本也罢,老版本也罢,都大同不异。找到SSMS管理器,打开如下:
服务器名称选择local,输入 你安装过程配置的账号及密码,点击连接,打开数据库。
打开后的页面如下:可以看到没有任何库。
我们创建一个库,就叫做csdnStudy吧。
输入数据库名称,点击下面的确定按钮
在SSMS左侧,我们就可以看到我们新建的数据库,我们库建好了,但是表完全是空的。下来,我们继续创建表。新建一个叫用csdnUser的表。
在表上右键,选择新建表:依次为此表增加相应的列名如下图所示:所有列名的数据类型最好与此教程中的保持一致,后期出现的错误、优化等,你都需要亲身体验一下。
这里你完全按照我们的初步设计来进行就可以,虽然存在储多不好的问题,这都是我们后期要逐步从化的。比如字段注释、表ID不能为空、字段占用长度等等,这里我们统统都不考虑。
然后保存表,ctrl+s出现输入表名的对话框,输入表名csdnUser,点击确定,表就新建好了。
好了。至此,我们的数据库已经准备好了,现在我们打开上一节,我们创建的项目,进行数据库的连接及使用。
在解决方案上右键,依次选择以下项:
找到类库(.NET Framework)选中,点击下一步:
输入 项目名称:DataProvider,点击创建按钮,这个项目我们就是专门用来进行数据库CRUD的项目。
再来看看我们的项目方案:
删除其中默认生成的 Class1.cs控制器。右键->删除即可。
然后我们需要添加ADO.NET数据实体类型来支持数据库的映射及访问:
在弹出来的页面中找到:ADO.NET实体数据类型项,点击右下角的添加按钮
选择“来自数据库的EF设计器”,点击下一步:
如果你看到的是如下的界面,则点击新建连接:
选择数据源为:Mircrosoft SQL Server,因为我们目前使用的确实是SQLSERVER进行实战演示,点击继续按钮:
这时正在检索所有可用的已经安装SQLSERVER的PC,让它检索完成:选择你的电脑,如果你不知道你的电脑名,则在你桌面上"我的电脑"->属性中查看你的计算机名。
我们在下拉列表中选择自己的电脑:
在"选择或输入数据库名称(D)"项下拉选择我们的数据库:csdnStudy,同时点击左下角的"测试连接"按钮进行连接测试,看是否连接正常。
可以看到,提示连接成功 ,说明一切OK,点击确定,测试连接成功的弹出框关闭,再点击连接属性对话框的确定,回到实体数据模型向导页面:如下两图所示
点击下一步,我们继续:
啥也不要改,继续点击下一步:
确认如下信息后,点击完成按钮。稍等片刻,等执行完毕,你将可看到如下基架。你可以自己看看里面生成的文件骨架,这里先不进行说明。
现在我们来看看DataProvider项目下的Model.edmx文件,双击此文件,你看到的是什么?是不是如下页面,懵逼了吧,我们的表呢?我们生成的模型呢?肯定是哪里出错了!
我们点击"模型浏览器",注意观察右侧的变化,我们在、Model.edmx文件上右键,选择"从数据库更新模型",再更新一次,还是一样的问题,生成的模型呢?
还是没有出现,我们再来看看控制台的输出:
这就再明白不过了,我们设计的csdnUser表没有主键!!所以 ,这就要求我们养成一个习惯,任何表必须有主键!
此时,我们再回过头来打开SSMS,在cdsnUser表上右键,选择设计,选择id行,右键将其设置为主键!保存文件。
设置成功后,看到主键是不允许为null的!
这时,我们再在这里生成模型:
你看,确实没有生成,如果某个表已经生成过,这里是不再出现这个表名的。点击以下页面的完成,OK,你看看,是不是已经变了。
这时再双击Model.edmx文件,你将能清楚看到通过数据库生成的模型!
再看看Model.tt下面也已经正确自动生成了表的数据模型。至此,模型的生成,已经OK。
接下来,我们添加对于模型的引用。在我们的WebApplication项目的引用目录上右键,选择"添加引用":
在项目子菜单中选择解决方案,勾选右侧DataProvider前的复选框,点击右下角的确定按钮,添加引用。
可以看到,已经添加成功。
然后我们对DataProvider项目进行重新生成
然后我们添加一个控制器,用来进行我们的业务逻辑
控制器名称输入:UserController,点击添加
控制器添加完成后,我们需要通过NuGet来安装EF(EFentifyFramework)相关的依赖包,否则,下一步就会出现csdnStudyEntities出现警告。勇者下图:依次选择工具->NuGet包管理器(N)->程序包管理器控制台
出现以下命令窗口:
我们现在通过命令来安装我们的EntityFramework 依赖:输入命令:其中红色的是固定的,你照着输入就行。蓝色为我们要替换的内容,分别为项目名称及我们要安装的版本。两者都得正确,否则仍然后续步骤仍然存在问题,无法继续。项目名称,就是我们的项目名称,这个不用多说。版本号,如果你不知道,你可以在DataProvider项目下的packages.config中查看版本号。
Install-package EntityFramework -ProjectNameWebApplication -Version6.2.0
确认输入完成后,回车等待安装完毕。因为我已经安装过,所以就不截图说明了,这一步,只要你输入正确,不会有什么错误,如果有错误,你就检查你的输入是否正确。
现在我们在UserController控制器中实现一个Get方法,如下所示:注意添加DataProvider的引用,第一行所示。
然后运行起来,拼写正确的路由:
https://localhost:44378/api/User/
我们看看接口返回什么,呀吼,不出意外,你又一次遇到异常了!
根据这个提示再明白不过了,我们需要将EF生成的实体连接配置到我们WebApplication项目中!停止运行项目,打开DataProvide项目下面的App.Config文件,复制其中的connectionStrings节点,如下红框所示。
将其粘贴到WebApplication项目下的web.config文件中。
我们再次运行起来,没有再报错了。同时看到接口返回了一个空的数组。为什么呢?因为我们这个表中确实没有数据呀。。
我们现在在数据库表中增加几条数据,再来执行此接口,看返回的是什么。
输入:insert into csdnUser ("id","name","sex") VALUES ('1265984563', 'Bill', 'f'),为指定的列设置数据。
全选当前语句:点击执行。
再通过语句查一下数据库,看看数据:
我们再次运行项目,看看接口返回什么了。
OK,非常完美,数据库表中的数据,全部查出来,并且通过接口正确返回!!限于篇幅,本节就到这里,下一节,我们来改造此接口,让接口返回更加轻量化的JSON数据。
第三讲:接口返回json数据