首页 > 其他分享 >WebAPI 初学 Visual Studio 2022,.NET 6.0(EF 代码迁移)

WebAPI 初学 Visual Studio 2022,.NET 6.0(EF 代码迁移)

时间:2024-11-07 10:43:59浏览次数:3  
标签:WebAPI get HR EF Visual API employee using public

按照一步一步来,您将能够创建 api

选择 C#、Windows 和 WebApi 

创建 API 后,单击绿色按钮运行应用程序,

现在我们可以看到 Demo 项目正在运行。尽管所有结构都是自动创建的,以运行 API。

此版本已自动配置 Swagger。

这是演示 API。Visual Studio 会自动添加所需的库。

现在我们可以根据要求开始编码并创建 API。

首先,我们将创建模型类,在其中定义表。

步骤1.

右键单击项目并选择添加 → 新建文件夹 → 将其命名为模型

在 Model 文件夹 Domain 和 DTOs 中创建两个文件夹

右键单击模型文件夹中的域文件夹→添加→类→将其命名为Employee.cs

打开员工模型类并需要添加属性

键入 prop 并按下 tab

它将生成属性,您可以根据需要更改属性的名称和类型。

using System.ComponentModel.DataAnnotations;

namespace HR_API.Models.Domain
{
    public class Employee
    {

        [Key]
        public Guid ID { get; set; }
        public int EMPNO { get; set; }
        public string ENAME { get; set; }
        public string JOB { get; set; }
        public string MGR { get; set; }
        public DateTime HIREDATE { get; set; }

    }
}

现在我们将使用 DBContext 类。

这将帮助我们:

  • 维护与数据库的连接。
  • 追踪修订
  • 执行 CRUD 操作。
  • 领域模型和数据库之间的桥梁。

要使用 DBContext 类,首先我们需要创建另一个文件夹来分离代码。

要使用 DBContext 类,我们需要为 DBContext 安装两个库。

右键单击项目

NuGet 包管理器

浏览并安装这两个包

  • 微软.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools

版本:- 6.0 

将新文件夹添加到项目并将其命名为数据

将新文件添加到数据文件夹

右键→添加→类别

using HR_API.Models;
using HR_API.Models.Domain;
using Microsoft.EntityFrameworkCore;
namespace HR_API.Data
{
    public class ApplicationDBContext:DbContext 
    {
        public ApplicationDBContext(DbContextOptions options) : base(options)
        {

        }
        public DbSet<Employee> Employees { get; set; }


    }
}

现在需要在 appsetting.json 中添加连接字符串

要添加,我们需要 SQL 服务器名称

从 SQL 服务器复制服务器名称连接到服务器窗口

应用程序设置.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "HRConnectionString": "Server=localhost\\4533\\SQLEXPRESS;Database=HR;TrustserverCertificate=True;Trusted_Connection=True;"
  }
}

依赖注入:

在 program.cs 中添加 

using HR_API.Data;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddDbContext<ApplicationDBContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("HRConnectionString"));
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

EF 代码迁移:

现在使用 EFCode Migration 根据您创建的模型在数据库中创建表。

运行代码迁移

工具 → NuGet 包迁移 → 包迁移控制台。—

添加迁移“NameofMigration”

添加迁移“初始迁移”

在此迁移的帮助下,创建了一个迁移文件

现在我们需要更新数据库

类型:更新数据库

现在您可以看到 HR 数据库已创建,并且数据库中已创建 Employee 表

现在我们需要在 API 中创建一个控制器

如何创建控制器:

右键单击 Controller 文件夹 → 添加 → 控制器

现在在 Model 文件夹中创建一个 DTO 文件夹

在 DTO 中创建一个文件以将数据插入数据库。

创建员工请求数据

namespace HR_API.Models.DTOs
{
    public class CreateEmployeeRequestDto
    {
        public int EMPNO { get; set; }
        public string ENAME { get; set; }
        public string JOB { get; set; }
        public string MGR { get; set; }
        public DateTime HIREDATE { get; set; }
    }
}

现在创建另一个文件来从数据库获取响应

员工数据表

namespace HR_API.Models.DTOs
{
    public class EmployeeDto
    {
        public Guid ID { get; set; }
        public int EMPNO { get; set; }
        public string ENAME { get; set; }
        public string JOB { get; set; }
        public string MGR { get; set; }
        public DateTime HIREDATE { get; set; }
    }
}

创建请求和响应模型后,在控制器文件中进行更改:

using HR_API.Models.DTOs;
using HR_API.Models.Domain;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using HR_API.Data;
using Microsoft.EntityFrameworkCore;

namespace HR_API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class EmployeeController : ControllerBase
    {
        private readonly ApplicationDBContext dbContext;  
        public EmployeeController(ApplicationDBContext dbContext)
        {
            this.dbContext = dbContext;
        }
        [HttpPost]
        public async Task<IActionResult> CreateEmployee(CreateEmployeeRequestDto requestDto)
        {

            //map dto to domain model
            var employee = new Employee
            {
                EMPNO = requestDto.EMPNO,
                ENAME = requestDto.ENAME,
                JOB = requestDto.JOB,
                MGR = requestDto.MGR,
                HIREDATE = requestDto.HIREDATE
            };

            await dbContext.Employees.AddAsync(employee);
            await dbContext.SaveChangesAsync();

            //domain model to dto

            var response = new EmployeeDto
            {
                EMPNO = employee.EMPNO,
                ENAME = employee.ENAME,
                JOB = employee.JOB,
                MGR = employee.MGR,
                HIREDATE = employee.HIREDATE

            };
            return Ok(response);
        }
    }
}

现在检查数据库,目前没有数据。

运行应用程序后

执行api后,数据就被插入了。

第一部分结束

第 2 部分。

在以上部分中,我们创建了在表中插入数据的 API。

存储库模式:

  • 存储库模式是一种用于将数据访问层与应用程序分离的设计模式。
  • 提供接口但不暴露实现
  • 有助于创建抽象。

存储库模式的好处:

  • 解耦
  • 一致性
  • 表现
  • 多数据源(切换)

实现存储库模式

添加新文件夹,将其命名为 Repositories

在 Repositories 文件夹中创建 Interface 和 Implementation 文件夹

创建一个接口作为IEmployeeRepository.cs

using HR_API.Models;
using HR_API.Models.Domain;

namespace HR_API.Repositories.Interface
{
    public interface IEmployeeRepository
    {
        Task<Employee> CreateEmployeeAsync(Employee employee);
    }
}

EmployeeRepository.cs

using HR_API.Data;
using HR_API.Models.Domain;
using HR_API.Repositories.Interface;

namespace HR_API.Repositories.Implementation
{

    public class EmployeeRepository : IEmployeeRepository
    {
        private readonly ApplicationDBContext dBContext;

        public EmployeeRepository(ApplicationDBContext dBContext)
        {
            this.dBContext = dBContext;
        }

        public async Task<Employee> CreateEmployeeAsync(Employee employee)
        {
            await dBContext.Employees.AddAsync(employee);
            await dBContext.SaveChangesAsync();

            return employee;
        }
    }
}

现在我们必须将此存储库类注入到 program.cs 文件中

using HR_API.Data;
using HR_API.Repositories.Implementation;
using HR_API.Repositories.Interface;
using Microsoft.EntityFrameworkCore;


var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddDbContext<ApplicationDBContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("HRConnectionString"));
});
builder.Services.AddScoped<IEmployeeRepository,EmployeeRepository>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

现在我们需要在 EmployeeController.cs 中进行更改

我们正在将存储库类注入到我们的控制器中。

private readonly IEmployeeRepository employeeRepository;

public EmployeeController(IEmployeeRepository employeeRepository )
{
    this.employeeRepository = employeeRepository;
}

public async Task<IActionResult> CreateEmployee(CreateEmployeeRequestDto requestDto)
 {

     //map dto to domain model
     var employee = new Employee
     {
         EMPNO = requestDto.EMPNO,
         ENAME = requestDto.ENAME,
         JOB = requestDto.JOB,
         MGR = requestDto.MGR,
         HIREDATE = requestDto.HIREDATE
     };

     await employeeRepository.CreateEmployeeAsync(employee);
}

EmployeeController.cs

using HR_API.Models.DTOs;
using HR_API.Models.Domain;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using HR_API.Data;
using Microsoft.EntityFrameworkCore;
using HR_API.Repositories.Interface;

namespace HR_API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class EmployeeController : ControllerBase
    {
        private readonly IEmployeeRepository employeeRepository;

        public EmployeeController(IEmployeeRepository employeeRepository )
        {
            this.employeeRepository = employeeRepository;
        }

        [HttpPost]
        public async Task<IActionResult> CreateEmployee(CreateEmployeeRequestDto requestDto)
        {

            //map dto to domain model
            var employee = new Employee
            {
                EMPNO = requestDto.EMPNO,
                ENAME = requestDto.ENAME,
                JOB = requestDto.JOB,
                MGR = requestDto.MGR,
                HIREDATE = requestDto.HIREDATE
            };

            await employeeRepository.CreateEmployeeAsync(employee);


            //domain model to dto

            var response = new EmployeeDto
            {
                EMPNO = employee.EMPNO,
                ENAME = employee.ENAME,
                JOB = employee.JOB,
                MGR = employee.MGR,
                HIREDATE = employee.HIREDATE

            };
            return Ok(response);
        }
    }
}

现在运行应用程序并插入数据

{
  "id": "00000000-0000-0000-0000-000000000000",
  "empno": 104,
  "ename": "David",
  "job": "Mgr",
  "mgr": "102",
  "hiredate": "2024-02-18T19:32:35.168Z"
}

插入数据后,我们可以在数据库中检查

我们插入的数据可用。

现在我们已经实现了存储库模式。

标签:WebAPI,get,HR,EF,Visual,API,employee,using,public
From: https://blog.csdn.net/hefeng_aspnet/article/details/143565016

相关文章

  • PEFT原理及代码
    一.soft-prompt训练大型预训练语言模型非常耗时且计算密集。随着模型规模的不断扩大,研究者们越来越关注更有效的训练方法,如提示(Prompt)。提示通过在输入中添加描述任务的文本提示,甚至通过提供任务示例,来为特定下游任务准备冻结的预训练模型。通过使用提示,您可以避免为每个下游......
  • Vue项目中动态路由与权限控制:router.beforeEach的使用及无token重定向登录页
    在现代前端项目中,权限控制是一个非常重要的环节。VueRouter作为Vue官方的路由管理器,为我们提供了强大的路由管理功能。在本文中,我们将探讨如何在Vue项目中使用router.beforeEach钩子函数来实现动态路由权限控制,并在用户未登录时自动重定向到登录页。步骤一:登录并获取Token首......
  • Educational Codeforces Round 161 (Rated for Div. 2) - VP记录
    Preface先被A题硬控\(20\)分钟,有点不爽。又看到E题AC的人比D题多而去嗑E题去了,结果D题反而是我更能做的。将问题排序:根据你所需付出的努力,将能够最快解决的问题排在前面。(答题的次序为:以前做过的,容易的,不熟悉的,难的)——李博杰《骗分导论》\(\rmP_{114}\)所以......
  • VBA(Visual Basic for Applications)宏是用于在Microsoft Office应用程序(如Excel、Word
    在MicrosoftWord中,VBA(VisualBasicforApplications)宏是一种非常强大的自动化工具,它能够帮助你在文档中执行一系列自动化操作,比如格式化、批量修改、数据处理等。下面是如何在MicrosoftWord中设置和使用VBA宏的详细步骤:1.启用开发者选项卡在MicrosoftWord中,默认情......
  • EF Core 仓储模式
    数据库:SqlServer为例安装包: 数据库连接DbContextpublicclassTestDbContext:DbContext{publicTestDbContext(DbContextOptions<TestDbContext>options):base(options){}publicDbSet<User>Users{get;set;}}注册数据库上下文builder.S......
  • 解决mysql 的 [HY000][1356] View ‘information_schema.TABLES‘ references invalid
    同事在修改mysql用户权限时修改了关于mysql.infoschema的权限信息,导致无法访问information_schema库下的所有视图,使用数据库连接工具连接MySQL数据库时出现报错情况,使用MySQL终端登录并执行show命令同样报错。报错信息如下:ERROR1356(HY000):View'information_s......
  • SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext
     SpringBoot的启动流程可以分为几个重要的步骤,其中之一是引导上下文(BootstrapContext)。引导上下文是在SpringBoot应用程序启动时创建的第一个Spring应用程序上下文,它负责加载和初始化SpringBoot的核心组件和配置。默认的引导上下文是通过DefaultBootstrapContext类来实现......
  • CompletableFuture异步编排接口优化方案
    接口优化方案(1)程序本身,减少不必要的条件判断、循环(2)减少数据库的交互次数,以及每个sql查询的数据量(列数和行数越少越好)(3)提高sql的性能,通过建立合适的索引(4)使用java8的stream流提高集合的遍历操作的效率(5)引入缓存,从redis中加载数据的效率高于mysql(6)使用多线程异步......
  • 如何使用nssm将asp.net core/.net6/.net8的webapi项目、mvc项目、控制台项目等注册为w
    nssm工具可以将asp.netFramework、asp.netcore、net6、.net8、.net10及后续本的的webapi项目、mvc项目、控制台项目、winform项、WPF项目等注册为windows服务。不仅限于上面这些,nssm可以将所有windows可执行文件注册为windows服务。下面,使用nssm将asp.net8的webapi项目注册为w......
  • left join 出现重复on导致sql语句报错
    leftjoin出现重复on导致sql语句报错​mybatis-plus开启多租户插件功能时,在进行链表查询时会重复出现on导致sql语句报错原因​原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器​分页拆件......