.NetCore3.1使用CodeFirst并查询数据 电脑版发表于:2020/11/15 12:37 # .NetCore3.1使用CodeFirst并查询数据 本文为小白简洁教程,前端玩多了后端基本的忘了,所以做个笔记! 源码已上传,有需要可自行[到这里](https://download.tnblog.net/resource/index/bcd3141c4edc422c87b52995dfd935af)去下载 # *目录* > [Code first](#Code first) >> [创建项目](#创建项目) >> [下载NuGet包](#下载NuGet包) >> [添加实体](#添加实体) >> [添加数据库上下文类](#添加数据库上下文类) >> [注入上下文类](#注入上下文类) >> [生成数据](#生成数据) > [后续测试](#后续测试) >> [添加接口并实现接口执行数据访问的业务类](#添加接口并实现接口执行数据访问的业务类) >> [控制器提供开放Api](#控制器提供开放Api) >> [控制器类运行测试](#控制器类运行测试) > [后言](#后言) # 正文 > # Code first > ## 创建项目 > 1.创建一个WebApi项目并且命名为`TodoApi` > 2.在该项目右键新建一个文件夹名为`Module`,主要放实现类, > 创建`TodoContext`,`UserInfo`,`UserInfoProcess`三个类 > 2.在该项目右键新建一个文件夹名为`Interface`,主要接口类 > 创建`IUserInfo`接口类 >![在这里插入图片描述](https://img-blog.csdnimg.cn/20201115110530623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI4NDA4,size_16,color_FFFFFF,t_70#pic_center) ## 下载NuGet包 - 下载并引入需要用到的包:可通过控制台或直接搜索安装 ```csharp Microsoft.EntityFrameworkCore //EFCore框架 Microsoft.EntityFrameworkCore.SqlServer //连接SQLserver依赖 Microsoft.EntityFrameworkCore.Tools //工具包(数据迁移等) Microsoft.EntityFrameworkCore.Design //数据库上下文 ``` ## 添加实体 在`UserInfo.cs`中创建一些字段,与数据库表对应的字段 - 特性说明 - `[Table("UserTable")]`:用于映射数据库的表名,这里映射的表名为"UserTable",可与实体名不一致 - `[Key]`映射数据库主键 ```csharp using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace TodoApi.Module { [Table("UserTable")] public class UserInfo { [Key] public int Id { get; set; } public string Name { get; set; } public string Password { get; set; } } } ``` ## 添加数据库上下文类 - `TodoContext.cs` ```csharp using Microsoft.EntityFrameworkCore; namespace TodoApi.Module { public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<UserInfo> UserInfo { get; set; } } } ``` ## 注入上下文类 - 先在项目根目录的`appsettings.json`资源文件中新增根节点数据库连接字符串 ```json { "ConnectionStrings": { "UserDB": "server=127.0.0.1;database=UserDB;uid=sa;pwd=1233456;" } } ``` - 配置连接字符串后在`Startup.cs`服务启动入口类`ConfigureServices`方法中获取连接字符串并添加注入上下文 ```csharp // 获取连接字符串 string sqlstr = Configuration.GetConnectionString("UserDB"); // 注入上下文 services.AddDbContext<TodoContext>(option => option.UseSqlServer(sqlstr)); ``` ## 生成数据 这Code First基本完成 通过 <kbd>工具</kbd>>><kbd>NuGet包管理器</kbd>>><kbd>程序包管理器控制台</kbd> 打开控制台 1. 给迁移搭建基架,运行:`Add-Migration InitialCreate`命令,InitialCreate自定义名 搭建基架成功后会生成一个文件夹里的基架代码(执行完第二步迁移后可删掉) 2. 将新迁移数据创建数据库,运行:`Update-Database` 迁移成功数据库会生成一个历史表(可删掉) 可在SQL server客户端查看是否创建成功 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201115115438705.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI4NDA4,size_16,color_FFFFFF,t_70#pic_center) > # 后续测试 ## 添加接口并实现接口执行数据访问的业务类 1. 这时候用到`IUserInfo.cs`了,这个接口带一个泛型,在里面写一个简单的获取用户数据的方法 ```csharp /// <summary> /// 用户业务逻辑层接口 /// </summary> interface IUserInfo<T> { /// <summary> /// 获取用户信息 /// </summary> List<T> getUserInfos(); } ``` 2. 实现接口,`UserInfoProcess.cs` ```csharp public class UserInfoProcess: IUserInfo<UserInfo> { //依赖注入上下文 private readonly TodoContext _db; public UserInfoProcess(TodoContext todoContext) { _db = todoContext; } public List<UserInfo> getUserInfos() { // 查询id大于5的用户信息 var query = _db.UserInfo.Where (a=>a.Id>5).ToList(); return query; } } ``` # 控制器提供开放Api ## 控制器类运行测试 在`Controllers`文件夹添加一个名为`UserController`空的控制器,控制器代码: ```csharp [Route("api/v1/[controller]")] [ApiController] public class UserController : ControllerBase { //依赖注入 private readonly UserInfoProcess _userprocess; public UserController(UserInfoProcess userprocess) { _userprocess = userprocess; } [HttpGet] [Route("GetUserInfos")] public List<UserInfo> GetUsers() { var query= _userprocess.getUserInfos(); return query; } } ``` - 选择控制台调试会更方便 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201115121047179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI4NDA4,size_16,color_FFFFFF,t_70#pic_center) 禁用浏览器调试 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020111512114564.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI4NDA4,size_16,color_FFFFFF,t_70#pic_center) - 运行程序 通过postman请求后发现报错 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201115121237624.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI4NDA4,size_16,color_FFFFFF,t_70#pic_center) 错误原因:没有依赖注入`UserInfoProcess.cs` 解决方案:在`Startup.cs`中注入`UserInfoProcess.cs` ```csharp //依赖注入 services.AddTransient<UserInfoProcess>(); ``` 添加后再次运行测试,这时候发现成功,在`UserInfoProcess.cs`中设置断点查看数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201115121609790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTI4NDA4,size_16,color_FFFFFF,t_70#pic_center) 这样子就基本完成codefrist的基本操作 # 后言 工作中做的项目到底有多大也不能忘了最基础的东西,此文当作一个复习,希望可以帮到小白!