zoukankan      html  css  js  c++  java
  • ASP.NET Core WebApi + EF Core(实现增删改查,使用Swagger测试API)

    EF有两个不同版本,即Entity Framework Core 和 Entity Framework 6

    EF Core:轻量级,可扩展,跨平台,参考EF6,全新平台,学习曲线小,引入一些新功能(批量删除

    EF 6 :笨重,稳定,微软已经不打算进行大版本升级,无法跨平台。

    如何实现EF Core功能

    1、创建ASP.NET Core Web应用程序 

    2、新建TodoItem类

      首先新建文件夹>Models

      在Models里添加TodoItem类

    1 public class TodoItem
    2     {
    3         public long Id { get; set; }
    4         public string Name { get; set; }
    5         public bool IsComplete { get; set; }
    6     }

    3、添加数据库上下文

      选择管理NuGet程序包

          

      选择“浏览”选项卡,然后在搜索框中输入 Microsoft.EntityFrameworkCore.SqlServer 

      在左窗格中选择“Microsoft.EntityFrameworkCore.SqlServer” 。

      选中右窗格中的“项目”复选框,然后选择“安装” 。

      使用上述说明再次添加 Microsoft.EntityFrameworkCore.InMemory

      两个NuGet安装完成后,然后在Models里新建TodoContext类。

    public class TodoContext : DbContext
        {
            public TodoContext(DbContextOptions<TodoContext> options)
                : base(options)
            {
            }
    
            public DbSet<TodoItem> TodoItems { get; set; }
        }

    4、注册数据库上下文

      在appsettings.json启动配置文件中创建连接sqlserver数据库的语句

      "ConnectionStrings": {
        "todoContext": "server=.;database=TodoDatas;uid=sa;pwd=123456"
      }

      转到Startup类,实现Startup类的构造方法,在ConfigureServices注册数据库上下文

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
            public IConfiguration Configuration { get; }
            // 该方法在运行时被调用。
            // 可以使用该方法将服务添加到容器中 例如 ASP.NET Core MVC 、 Entity Framework Core 和 Identity 
            // 更多信息配置应用程序的信息,可以查看 https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
                //使用sqlserver数据库
                services.AddDbContext<TodoContext>(opt =>
                   opt.UseSqlServer(Configuration.GetConnectionString("todoContext")));
                services.AddControllers();
            }
    
            // 该方法在运行时被调用
            // 可以使用该方法来配置 HTTP 请求管道/用于定义请求管道中的中间件
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
        }

    5、 安装迁移包—通过代码生成数据库(sqlserver)

      打开程序包管理控制台

      输入:Add-Migration InitDatabase

      输入:update-database 生成数据库

    6、添加控制器

      新建文件夹>Controllers

      在Controllers里添加TodoController控制器

    namespace TodoApi.Controllers
    {
        //如果访问的路径为404则需要配置路由
        [Route("api/[controller]")]
        [ApiController]
        public class TodoController : Controller
        {
            private readonly TodoContext _context;
            public TodoController(TodoContext context)
            {
                _context = context; if (_context.TodoItems.Count() == 0)
                {
                    // 如果集合为空,则创建新的 TodoItem,
                    // which means you can't delete all TodoItems. _context.TodoItems.Add(new TodoItem { Name = "Item1" }); _context.SaveChanges(); 
                    _context.TodoItems.Add(new TodoItem { Id = 1, Name = "Item1", IsComplete = false });
                    _context.TodoItems.Add(new TodoItem { Id = 2, Name = "Item2", IsComplete = false });
                    _context.TodoItems.Add(new TodoItem { Id = 3, Name = "Item3", IsComplete = true });
                    _context.SaveChanges();
                }
            }
    
            [HttpGet]
            public IEnumerable<TodoItem> GetAll() 
            {
                return _context.TodoItems.ToList();
            }
        } 
    }

      访问页面为4.4则需要设置路由

      转到launchSettings.json,添加"launchUrl":"api/Todo"

    {
      "iisSettings": {
        "windowsAuthentication": false, 
        "anonymousAuthentication": true, 
        "iisExpress": {
          "applicationUrl": "http://localhost:54029",
          "sslPort": 44320
        }
      },
      "profiles": {
        "IIS Express": {
          "commandName": "IISExpress",
          "launchBrowser": true,
          "launchUrl": "api/Todo",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "TodoApi": {
          "commandName": "Project",
          "launchBrowser": true,
          "applicationUrl": "https://localhost:5001;http://localhost:5000",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        }
      }
    }

    7、增删改查

    namespace TodoApi.Controllers
    {
        //如果访问的路径为404则需要配置路由
        [Route("api/[controller]")]
        [ApiController]
        public class TodoController : Controller
        {
            private readonly TodoContext _context;
            public TodoController(TodoContext context)
            {
                _context = context;
                if (_context.TodoItems.Count() == 0)
                {
                    // 如果集合为空,则创建新的 TodoItem,
                    // which means you can't delete all TodoItems. _context.TodoItems.Add(new TodoItem { Name = "Item1" }); _context.SaveChanges(); 
                    _context.TodoItems.Add(new TodoItem { Name = "Item1", IsComplete = false });
                    _context.TodoItems.Add(new TodoItem { Name = "Item2", IsComplete = false });
                    _context.TodoItems.Add(new TodoItem { Name = "Item3", IsComplete = true });
    
                    _context.SaveChanges();
                }
            }
    
            [HttpGet]
            public IEnumerable<TodoItem> GetAll()
            {
                return _context.TodoItems.ToList();
            }
    
            /// <summary>
            /// 根据Id查找数据
            /// </summary>
            /// <param name="Id">序号</param>
            /// <returns></returns>
            [HttpGet("{Id}")]
            public async Task<TodoItem> GetByID(int Id)
            {
                var item = await _context.TodoItems.FirstOrDefaultAsync(t => t.Id == Id);
    
                return item;
            }
    
            /// <summary>
            /// 创建
            /// </summary>
            /// <param name="item"></param>
            /// <returns></returns>
            [HttpPost]
            public async Task<IActionResult> Create([FromBody] TodoItem item)
            {
                if (item == null)
                {
                    return BadRequest();
                }
                else
                {
                    _context.TodoItems.Add(item);
                    await _context.SaveChangesAsync();
                    return Ok(item);
                }
            }
    
            /// <summary>
            /// 修改
            /// </summary>
            /// <param name="Id"></param>
            /// <param name="item"></param>
            /// <returns></returns>
            [HttpPut("{id}")]
            public async Task<IActionResult> Update(int id, [FromBody] TodoItem item)
            {
                if (item == null)
                {
                    return BadRequest();
                }
                else
                {
                    var todo = _context.TodoItems.SingleOrDefault(t => t.Id == id);
    
                    if (todo == null)
                    {
                        return NotFound();
                    }
                    else
                    {
                        todo.IsComplete = item.IsComplete;
                        todo.Name = item.Name;
    
                        _context.TodoItems.Update(todo);
                        await _context.SaveChangesAsync();
    
                        return Ok(todo);
                    }
    
                }
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="Id"></param>
            /// <returns></returns>
            [HttpDelete("{Id}")]
            public async Task<IActionResult> Delete(int Id)
            {
                var todo = _context.TodoItems.SingleOrDefault(t => t.Id == Id);
    
                if (todo == null)
                {
    
                    return NotFound();
                }
                else
                {
                    _context.TodoItems.Remove(todo);
                    await _context.SaveChangesAsync();
    
                    return Ok();
                }
            }
        }
    }

      运行效果展示

    8、使用swagger

      Swagger兼具了API文档管理和测试的功能

      打开程序包管理控制台

      输入:Install-Package Swashbuckle.AspNetCore

      安装成功后转到Startup类,要将swagger middle添加到请求管道,需要在startup类的ConfigureServices方法中添加swaggergen方法,

      如果要启用这个中间件,我们还需要在startup类的Configure方法中调用useswagger方法。

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
            public IConfiguration Configuration { get; }
            // 该方法在运行时被调用。
            // 可以使用该方法将服务添加到容器中 例如 ASP.NET Core MVC 、 Entity Framework Core 和 Identity 
            // 更多信息配置应用程序的信息,可以查看 https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
                //使用sqlserver数据库
                services.AddDbContext<TodoContext>(opt =>
                   opt.UseSqlServer(Configuration.GetConnectionString("todoContext")));
                services.AddControllers();
                services.AddMvcCore();
    
                services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
                });
            }
    
            // 该方法在运行时被调用
            // 可以使用该方法来配置 HTTP 请求管道/用于定义请求管道中的中间件
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseSwagger();
    
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
                });
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
        }

      输入路径:https://localhost:44320/swagger/index.html

      效果展示

      后续会陆续更新其他资料,喜欢请关注哦!

  • 相关阅读:
    Java 位运算(移位、位与、或、异或、非)
    负数的二进制表示方法(正数:原码、负数:补码)
    MacOS X终端里SSH会话管理
    Mac软件分享:上小巧实用的GIF格式录屏软件 LICEcap
    问题追踪:ImageView执行缩放动画ScaleAnimation之后,图像显示不全的问题。
    自定义res/anim加载类,加载自定义Interpolator
    原文翻译 Android_Develop_API Guides_Animation Resources(动画资源)
    OAuth2.0详解
    Grails框架使用指南
    Groovy语言学习汇总
  • 原文地址:https://www.cnblogs.com/duhaoran/p/12661570.html
Copyright © 2011-2022 走看看