Intern Day6

大纲

  • 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。

具体实现

  1. 按照下面这张图创建对应文件夹和文件:

  2. 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
            }
        }
    }
    
  3. 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; }
        }
    }
    
  4. 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; }
        }
    }
    
  5. 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; }//任务是否完成
        }
    }
    
  6. 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(); });
            }
        }
    }
    
  7. 最后可以通过访问 https://localhost:5001/todo/getall 等来访问内容

迁移

这一部分先跳过

  • 遇到的问题:无法打开所请求的数据库:

  • 问题根本原因:数据库还没有

  • 解决办法:迁移,把这个模型生成一个数据库,用迁移的话需要安装一些包(NuGet),需要装一下Microsoft.EntityFrameworkCore,装好之后迁移一下代码通过代码生成数据库(Add-Migration InitDatabase(这个名字随便取)),……还有一系列操作,暂时没听懂……之后在完善后面的。

学习视频

https://www.xcode.me/video/87db00955f3a4bbfbe4ca6f0781397c1

原文地址:https://www.cnblogs.com/OFSHK/p/14436667.html