zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    设计模式
    工厂方法模式
    简单工厂模式
    tornado自定义Form组件
    tornado
    Tornado框架的知识系列
    Linux基本命令
    day2
    day1
    使用cp复制文件夹却不能打开
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14436667.html
Copyright © 2011-2022 走看看