大纲
-
ASP.NET Core Web 应用启动流程图:
-
目的:如何写一个标准的API,认识一下开发框架
-
解决路径:创建一个 ASP.NET Core WebAPI 项目,在 WebAPI 项目中使用 Entity Framework Core 进行数据访问,依赖注入 DbContext 数据上下文,连接字符串配置,数据库迁移与回滚,通过 Swashbuckle 生成 WebAPI 帮助文档。
-
补充知识:
-
一般情况下API都要用到一些数据库,用数据库最简单的办法就是在数据库里面去建表,表建好之后通过EF去访问。
-
EF有两个不同的版本,Entity Framework Core(EF Core) 和 Entity Framework 6(EF 6)。
- EF Core(尽量用这个):轻量级、可扩展、跨平台、参考EF6、引入了一些新功能(批量更新、批量删除)。
- EF6:笨重,稳定,无法跨平台。
- EF最出名的就是code first(比较流行),相反的就是db first。
-
具体实现
-
按照下面这张图创建对应文件夹和文件:
-
TodoController.cs
using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using WebApplication3.Model; namespace WebApplication3.Controllers { [Route("[controller]")] //写一个路由 public class TodoController : Controller { // GET /* public IActionResult Index() { return View(); }*/ // 注入一般在控制器注入,注入的一般写法如下: private readonly TodoContext context; // 私有的、只读的 // context如何实现的,通过构造函数来实现: public TodoController(TodoContext context) { this.context = context; if (!this.context.TodoItems.Any()) // Any查询是否存在数据,没有就加一下,制造一些掩饰数据 { this.context.TodoItems.Add(new TodoItem {ID = 1, Name = "Item1", IsComplete = false}); this.context.TodoItems.Add(new TodoItem {ID = 2, Name = "Item2", IsComplete = false}); this.context.TodoItems.Add(new TodoItem {ID = 3, Name = "Item3", IsComplete = true}); this.context.SaveChanges(); //this.也可以不要,但是通过this可以提高可读性 // 保存到数据库中 } } /// <summary> /// /todo/getall /// </summary> /// <returns></returns> //[HttpGet("wewe")] // 打标记 [HttpGet("getall")] // 打标记 public List<TodoItem> GetAll() // 返回一个集合 { /* //如何使用 DbContextOptions options = DbContextOptionsBuilder<TodoContext>().Options.; // 最终原理是:通过它来生成数据库的一些参数 TodoContext context = new TodoContext(); context.TodoItems.add();*/ return context.TodoItems.ToList(); // 返回所有的TodoList } } }
-
Model.cs
using System.ComponentModel.DataAnnotations; namespace WebApplication3.Model { public class Model { public int ID { get; set; } [MaxLength(30)] // 任务长度 public string Name { get; set; } public bool IsComplete { get; set; } } }
-
TodoContext.cs
using Microsoft.EntityFrameworkCore; namespace WebApplication3.Model { public class TodoContext:DbContext // 继承DbContext表示我是一个数据库 { //提供一个构造函数 需要调用base public TodoContext(DbContextOptions options):base(options) { } public DbSet<TodoItem> TodoItems { get; set; } } }
-
TodoItem.cs
using System.ComponentModel.DataAnnotations; namespace WebApplication3.Model { public class TodoItem { public int ID { get; set; }//定义主键 [MaxLength(30)] // 指定任务长度 public string Name { get; set; }//定义任务名字 public bool IsComplete { get; set; }//任务是否完成 } }
-
Startup.cs
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using WebApplication3.Model; namespace WebApplication3 { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 这个方法用于处理中间件/配置服务,在时候被执行 // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) // 注入 { // 添加 services.AddDbContext<TodoContext>(options => options.UseInMemoryDatabase("tododb")); // service这个容器里面注入dbcontext,传入一个 tododb 字符串 //MemoryDatabase内存数据库:微软通过内存模拟了一个secseray,允许dbcontext访问,可以更换成pgsql等,这行代码表示可以往这个数据库里添加数据 services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo {Title = "WebApplication3", Version = "v1"}); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) // 这个方法用于处理HTTP请求的管道(如路由等) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication3 v1")); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }
-
最后可以通过访问 https://localhost:5001/todo/getall 等来访问内容
迁移
这一部分先跳过
-
遇到的问题:无法打开所请求的数据库:
-
问题根本原因:数据库还没有
-
解决办法:迁移,把这个模型生成一个数据库,用迁移的话需要安装一些包(NuGet),需要装一下Microsoft.EntityFrameworkCore,装好之后迁移一下代码通过代码生成数据库(Add-Migration InitDatabase(这个名字随便取)),……还有一系列操作,暂时没听懂……之后在完善后面的。