P1 准备工作
三者的依赖关系
创建api项目
上面输入Asp.net core进行搜索
3.0的api模板现在比较简洁,以前博主是倾向于直接选择Empty的项目。
创建后的项目比较简洁,带了一个Controller还有一个modle
这是一个modle类
它是一个简单的Controller
这两个都是用来演示的,我们不需要直接删掉就可以了
Program类
这个类比较重要。
Main方法负责配置和运行整个web程序
下面这个方法会实现IHosetBuilder的对象。
实际创建出来的就是HostBuilder的实例
有了HostBuilder以后,再使用它的Build方法,就可以创建出来这个数组,
创建的这个数组,实现了IHost这个接口。
最后调用数组上的Run方法来运行我们这个web程序。这里的代码就暂时先不改了。
项目在建立之后,实际上是进行了一些默认的配置。在源码中可以看到。这里就先不看了。
我们主要注重看这一行代码。这里使用到了Startup这个类。
Startup类主要就两个方法
它有一个构造函数,注入了IConfiguration。有了IConfiguration我们就可以使用配置信息了。例如Appsetting.json里面的配置信息就可以用。
.net core有服务的容器,这个方法就是向服务的容器注入服务。已经注册的服务就可以通过依赖注入的方式,在整个应用程序的其他地方进行使用。
AddController仅仅是包含了构建API的服务。在.net core 2.0的时候我们这里是写的AddMvc()但是在3.0里面包含了很多的东西,我们并不需要。
configure方法
主要指定.net core程序是如何响应http请求的,换句话就是我们在这里配置请求的管道。怎么配置呢,就是在这里添加很多的中间件。
这里的每一个Use就相当于添加了一个中间件
IsDevelopment判断当前是不是开发环境。如果是的话,在发生异常的时候就会返回一个错误页面,
UseAuthorization为整个应用程序添加了授权的能力。通常授权的配置是在ConfiureServices方法里面来完成的
修改启动
相当于是点了项目右键属性,然后找到dubug
这是默认的配置
相当于是删除了这些
都删除就剩下这些
运行程序
页面是404,这是因为我们把默认的Controller给删掉了。
我们先不改了 因为我们还没有创建Controller
数据库
使用sqlite然后使用EF
现在需要在项目里面添加EF core和 sqlite
Microsoft.EntityFrameworkCore
Tools是用来做迁移用的
创建model
创建文件夹entities
创建Comnany的类
公司类,里面有员工Employee。
创建Employee类。用的是Resharp的快捷键
用Resharp的快捷键移动到单独的类里面。
代码提前写好,放进来
性别是一个枚举类。
public enum Gender
{
男=1,
女=2
}
关联 的导航属性
创建DbContext
创建一个Data文件夹,然后创建RoutineDbContext
对实体的属性值进行一些 限制,重写OnModelCreating方法
指向Company这个实体,它的name属性,首先是必填的 。然后长度是100
其他的属性写完这段代码 ,
modelBuilder.Entity<Company>().Property(x => x.Name).IsRequired().HasMaxLength(100); modelBuilder.Entity<Company>().Property(x => x.Introduction).IsRequired().HasMaxLength(500); modelBuilder.Entity<Employee>().Property(x => x.EmployeeNo).IsRequired().HasMaxLength(10); modelBuilder.Entity<Employee>().Property(x => x.FirstName).IsRequired().HasMaxLength(50); modelBuilder.Entity<Employee>().Property(x => x.LastName).IsRequired().HasMaxLength(50); modelBuilder.Entity<Employee>().HasOne(x => x.Company) .WithMany(x => x.Employees) .HasForeignKey(x => x.CompanyId).OnDelete(DeleteBehavior.Restrict);
手动指明了这两个实体的一对多的关系
在删除公司的时候,如果公司下有员工的话就没法删除。这是禁制级联删除
DbContext需要DbContextOptions这个参数才能工作。在构造函数里面,将这个配置传递进去。
把这两个实体映射到数据库的表内。
还可以初始化数据:https://github.com/Surbowl/ASP.NET-Core-RESTful-Note/blob/master/Routine/Routine.APi/Data/RoutineDbContext.cs
Repository
首先是创建Services文件夹
先创建接口类
这段代码没录,写好放进去
最后保存的动作也在了Repository里面了。
Repository实现类
创建CompanyRepository实现刚才写的接口类ICompanyRepository
构造函数内注入DbContext
开始写具体方法的内的代码
要注意的地方,方法要用async来修饰我们当前这个方法,下面在查询的时候才可以使用await 异步的形式。
更新,不写也行,EF Core是争对实体进行跟踪的,
员工部分
获取公司下面的某一个员工
添加员工
更新员工,因为属性是动态跟踪的,所以不用写这行代码了。
删除和保存。
注意保存SaveChangesAsync()这里判断的是大于等于0
保存通常不写在Repository里面
注册
注册DbContext。在里面我们可以有一些配置
使用Sqlite然后里面放上链接字符串。
遇到的问题,找不到UseSqlite方法
option.Use就是没有找到带UseSql开头的。很是郁闷。
刚开始以为是nuget引用的包的版本太高了引起的,后来换门降低了版本到3.1.10
后来经过搜索:
三个步骤,1。首先安装所依赖的包, 2是引用EntityFrameworkCore的命名空间 3,使用UseSqlServer的方法。
发现引入命名空间using Microsoft.EntityFrameworkCore;果然可以找到UseSqlite的方法了。
继续代码
每次运行删除数据库并重新迁移。在Program.cs类内。
注意引入命名空间using Microsoft.Extensions.DependencyInjection; 主要是Services需要引入这个命名空间
加入异常
迁移
也可以在这里找到包管理器的控制台
添加迁移的命令:Add-Migration InitialMigration
我本人的机器迁移后
生成了两个类,一个是迁移的变化,再就是当前数据库的快照。
运行
可以看到控制台输出了一些代码
这里的日志都是绿色的info级别的log,说明都成功了。
我本机运行程序后,并没有输出那些sql语句
根目录出现了一个db文件,数据库出来了 说明迁移已经成功了。
打开后添加一个数据源
找到这个db文件
测试连接
已经有三条数据了
我本机打开数据库
结束