当前位置: 首页 > news >正文

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"
}

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

我们插入的数据可用。

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


http://www.mrgr.cn/news/67615.html

相关文章:

  • 【系统设计】提升Kafka系统性能:Spring Boot实现Lag感知的生产者与消费者
  • 5G NR物理层|5G PHY层概述
  • 斗破QT编程入门系列之一:认识Qt:初步使用(四星斗师)
  • MySQL索引、B+树相关知识总结
  • Spark 中 RDD 的诞生:原理、操作与分区规则
  • 使用AMD GPU进行图像分类的ResNet模型
  • C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程
  • 【代码分支管理】你知道什么 GitFlow 吗?
  • 你是否在为如何撰写国自然基金申请书而苦恼?快来轻松掌握申请技巧!脱颖而出
  • 2024-11-6----Android 11(全志713m)----- 关于添加 Selinux 权限
  • Call For Speaker! |2025中国国际音频产业大会(GAS)演讲嘉宾征集令启动!
  • Java基础使用①Java特点+环境安装+IDEA使用
  • 奇妙的交互,真的可以实现CanOpen转Profinet吗?
  • 欧协杯:射手缺席,紫百合远征塞浦路斯
  • java冒泡排序
  • 隐世绝秘天书,千门八将到底讲了什么,你之所以不成功,是没有人告诉你真相,你想知道吗?
  • 保护核心数据-----日记审计
  • 解决微信小程序电脑能正常使用,手机端无法正常访问的问题
  • Ubuntu24.04网络异常与应对方案记录
  • 前端面试题
  • Multi‐modal knowledge graph inference via media convergenceand logic rule
  • 《Java核心技术 卷I》对象克隆
  • 三周精通FastAPI:35 最常用的模板引擎Jinja2
  • scala list系列
  • Sigrity Power SI 3D-EM Capacitance Extraction模式如何进行电容的提取操作指导
  • 打印等边三角形和直角三角形(用循环)C语言