WebAPI 初学 Visual Studio 2022,.NET 6.0(EF 代码迁移)
按照一步一步来,您将能够创建 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 modelvar 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 dtovar 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 modelvar 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 modelvar 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 dtovar 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"
}
插入数据后,我们可以在数据库中检查
我们插入的数据可用。
现在我们已经实现了存储库模式。