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

后来经过搜索:

https://stackoverflow.com/questions/43098065/entity-framework-core-dbcontextoptionsbuilder-does-not-contain-a-definition-for

三个步骤,1。首先安装所依赖的包, 2是引用EntityFrameworkCore的命名空间 3,使用UseSqlServer的方法。

发现引入命名空间using Microsoft.EntityFrameworkCore;果然可以找到UseSqlite的方法了。

 

 

继续代码

 

每次运行删除数据库并重新迁移。在Program.cs类内。

注意引入命名空间using Microsoft.Extensions.DependencyInjection; 主要是Services需要引入这个命名空间

 


加入异常

迁移


也可以在这里找到包管理器的控制台

添加迁移的命令:Add-Migration InitialMigration

我本人的机器迁移后

 


生成了两个类,一个是迁移的变化,再就是当前数据库的快照。

运行

可以看到控制台输出了一些代码

这里的日志都是绿色的info级别的log,说明都成功了。

我本机运行程序后,并没有输出那些sql语句



根目录出现了一个db文件,数据库出来了 说明迁移已经成功了。




打开后添加一个数据源

找到这个db文件



测试连接



已经有三条数据了

 

我本机打开数据库

 

结束

 

posted @ 2020-03-21 21:07  高山-景行  阅读(347)  评论(0编辑  收藏  举报