使用 Entity Framework Code First 方法创建 ASP.NET Core 5.0 Web API
介绍
在本文中,我们将使用 Entity Framework Core 的“代码优先”方法在 ASP.Net Core 中创建 WEB API。在此,我们将创建一个简单的员工 CRUD 操作,并使用 Swagger 对其进行测试。在此 API 中,我们不会使用身份验证,我们将在后续文章中添加此功能。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
示例代码:https://download.csdn.net/download/hefeng_aspnet/91997439
在本文中:
创建 ASP.Net Core Web API 项目
添加实体框架并创建表
创建服务以执行 CRUD 操作
在控制器中实现服务
使用 Swagger 测试 API
创建 ASP.Net Core Web API 项目
步骤 1
打开 Visual Studio 并创建一个新项目。这里我使用的是 Visual Studio 2019。您可以根据您的系统和需求使用。
步骤 2
查找并选择 Asp.Net Core Web API,然后单击下一步按钮。
步骤3
在下一个向导中,您必须输入以下内容,然后单击“下一步”按钮
项目名称
项目位置(您想要保存项目的路径)
步骤4
在此向导屏幕中,您必须指定以下内容,然后单击创建按钮。
目标框架,这里我使用的是系统中安装的当前版本 5。
身份验证类型:目前在这个项目中,我们没有使用身份验证,所以这里我选择无。
配置 HTTPS:如果您使用安全的 HTTPS 连接托管 API,则可以选中此框。它将在您的项目中添加重定向,以帮助将 http 请求自动重定向到 HTTPS。
启用 Docker:对于这个项目,我们不使用 Docker,因此不要选中
启用 Open AI 支持:如果您想在项目中实现 Swagger,则必须选中此框。在这个项目中,我们将使用 Swagger,所以我选中了此框。
现在您的项目已创建完毕,您可以在下图中看到项目结构。如果您不需要,请删除天气控制器和模型等额外文件。
添加实体框架并创建表
为了在我们的项目中使用实体框架并使用代码优先方法创建表,我们必须遵循以下步骤。
步骤 1
右键单击项目名称,然后单击“管理 NuGet 包”。
步骤2
安装以下 NuGet 包。
Microsoft.EntityFrameworkCore.SqlServer:此包用于从我们的 C# 和 .Net Core 与 SQL Server 进行交互。
Microsoft.EntityFrameworkCore.Tools:此包包含各种命令,例如 Add-Migration、Drop-Database、Get-DbContext、Get-Migration、Remove-Migration、Scaffold-DbContext、Script-Migration 和 Update-Database。在本文中,我们使用 Add-Migration 和 Update-Database 命令。
Microsoft.Extensions.Configuration:使用这个 NuGet 包,我们可以从应用设置文件中读取数据。我们将从应用设置文件中获取连接字符串。
步骤3
现在我们在解决方案中添加一个新文件夹来包含各种类。要在解决方案中添加新文件夹,请右键单击项目名称,然后单击“添加”,然后单击“新建文件夹”,并将名称命名为“Models”。
步骤4
在这个 Models 文件夹中,我们将使用实体类。右键单击此文件夹,然后单击“添加”,再单击“类”。为你的类起一个合适的名称。
步骤5
在表中添加您想要创建的字段。这里我创建了一个 Employee 类,其中包含以下字段。这里的 key 属性定义了使用此列作为主键。
public class Employees {
[Key]
public int EmployeeId {
get;
set;
}
public string EmployeeFirstName {
get;
set;
}
public string EmployeeLastName {
get;
set;
}
public decimal Salary {
get;
set;
}
public string Designation {
get;
set;
}
}
步骤6
现在我们创建一个上下文类,用作 SQL Server 的中间件。在 Models 文件夹中添加一个新类,并添加构造函数和 Employee DbSet,如下代码所示。
public class EmpContext: DbContext {
public EmpContext(DbContextOptions options): base(options) {}
DbSet < Employees > Employees {
get;
set;
}
}
步骤7
现在我们需要将 SQL Server 连接到我们的项目,为此,我们需要一个连接字符串,并且我们将为此字符串添加应用内设置文件。请按如下所示添加您的连接字符串。
如上代码所示,我传入了 .(点)作为服务器名称,因为我使用的是本地 SQL Server。然后输入数据库名称 Tutorial,如果该数据库不存在,则会自动生成。这里我没有输入任何用户名和密码,因为我使用的是 Windows 身份验证。如果您想使用其他方式登录,请输入用户名和密码。
步骤8
现在我们必须在我们的启动文件中添加Db Context,对于这个打开的启动文件,并添加以下代码。
services.AddDbContext<EmpContext>(x => x.UseSqlServer(Configuration.GetConnectionString("ConStr")));
在ConfigureService方法中,我们添加EmpContext类,并通过使用Configure.GetConnectionString()方法从我们的appsetting文件中获取连接字符串。
步骤9
现在通过单击工具菜单,然后单击 NuGet 包管理器,然后单击包管理器控制台来打开包管理器控制台。
步骤 10
添加以下命令。
Add-Migration Init
这里的 Init 是迁移的名称,您可以根据自己的选择进行命名。按回车键。
步骤11
正如您所见,您的解决方案中创建了名为 Migration 的新文件夹,并且在此项目中有两个文件。一个是 EmpContextModelSnapshot,另一个是 *_Init,这里的 * 表示日期时间戳。
在这个初始化文件中,有下面的代码。当我们使用下一个命令时,这段代码就会执行,它会生成一个名为“Employees”的新数据库和新表。
using Microsoft.EntityFrameworkCore.Migrations;
namespace ASPNetCoreWebAPiDemo.Migrations {
public partial class Init: Migration {
protected override void Up(MigrationBuilder migrationBuilder) {
migrationBuilder.CreateTable(name: "Employees", columns: table => new {
EmployeeId = table.Column < int > (type: "int", nullable: false).Annotation("SqlServer:Identity", "1, 1"),
EmployeeFirstName = table.Column < string > (type: "nvarchar(max)", nullable: true),
EmployeeLastName = table.Column < string > (type: "nvarchar(max)", nullable: true),
Salary = table.Column < decimal > (type: "decimal(18,2)", nullable: false),
Designation = table.Column < string > (type: "nvarchar(max)", nullable: true)
}, constraints: table => {
table.PrimaryKey("PK_Employees", x => x.EmployeeId);
});
}
protected override void Down(MigrationBuilder migrationBuilder) {
migrationBuilder.DropTable(name: "Employees");
}
}
}
步骤12
目前,我们的数据库和表尚未创建,因此请在服务器端使用以下命令进行更改。
Update-Database
现在您可以看到我们的 SQL Server Employee 表是使用与我们在模型中添加的相同的字段创建的。
创建新的响应模型
为了保存和删除,我们将返回一个新的模型来向用户发送数据。在您的解决方案中创建一个名为 ViewModels 的新文件夹,因为我们希望将实体类和其他类存储在不同的位置。在此文件夹中添加一个名为 ResponseModel 的新类,并设置以下属性,如下代码所示。
public class ResponseModel {
public bool IsSuccess {
get;
set;
}
public string Messsage {
get;
set;
}
}
创建服务以执行 CRUD 操作
在这个项目中,我们将使用存储库模式与数据库交互。我们不会在控制器中调用数据库,而是创建一个新的服务并在其中调用数据库。为此,我们将创建一个接口和一个类,然后为它们添加依赖注入。
步骤 1
创建一个具有以下方法的接口,如下面的代码所示。
using ASPNetCoreWebAPiDemo.Models;
using ASPNetCoreWebAPiDemo.ViewModels;
using System.Collections.Generic;
namespace ASPNetCoreWebAPiDemo.Services
{
public interface IEmployeeService
{
/// <summary>
/// get list of all employees
/// </summary>
/// <returns></returns>
List<Employees> GetEmployeesList();
/// <summary>
/// get employee details by employee id
/// </summary>
/// <param name="empId"></param>
/// <returns></returns>
Employees GetEmployeeDetailsById(int empId);
/// <summary>
/// add edit employee
/// </summary>
/// <param name="employeeModel"></param>
/// <returns></returns>
ResponseModel SaveEmployee(Employees employeeModel);
/// <summary>
/// delete employees
/// </summary>
/// <param name="employeeId"></param>
/// <returns></returns>
ResponseModel DeleteEmployee(int employeeId);
}
}
步骤2
创建一个新类,并在该类中实现该接口。
步骤3
现在打开你的启动文件,并在 ConfigurationService 方法中添加以下代码行,以添加类和接口的依赖关系。这意味着当我们从此接口调用任何方法时,它将自动调用该类中的方法。
services.AddScoped<IEmployeeService, EmployeeService>();
构造服务
我们将在我们的服务类中使用 DbContext,为此我们在构造函数中添加依赖项,如下面的代码所示。
private EmpContext _context;
public EmployeeService(EmpContext context) {
_context = context;
}
获取所有员工的方法
/// <summary>
/// get list of all employees
/// </summary>
/// <returns></returns>
public List < Employees > GetEmployeesList() {
List < Employees > empList;
try {
empList = _context.Set < Employees > ().ToList();
} catch (Exception) {
throw;
}
return empList;
}
在上面的代码中,您可以看到我们从此方法返回了一个员工列表。要从数据库中检索数据,我们使用 DbContext 的 toList() 方法。
通过 ID 方法获取员工详细信息
/// <summary>
/// get employee details by employee id
/// </summary>
/// <param name="empId"></param>
/// <returns></returns>
public Employees GetEmployeeDetailsById(int empId) {
Employees emp;
try {
emp = _context.Find < Employees > (empId);
} catch (Exception) {
throw;
}
return emp;
}
在上面的代码中,您可以看到此方法接受一个参数 ID。我们从数据库中获取一个员工对象,其员工 ID 与我们的参数 id 匹配。
保存员工方法
/// <summary>
/// add edit employee
/// </summary>
/// <param name="employeeModel"></param>
/// <returns></returns>
public ResponseModel SaveEmployee(Employees employeeModel) {
ResponseModel model = new ResponseModel();
try {
Employees _temp = GetEmployeeDetailsById(employeeModel.EmployeeId);
if (_temp != null) {
_temp.Designation = employeeModel.Designation;
_temp.EmployeeFirstName = employeeModel.EmployeeFirstName;
_temp.EmployeeLastName = employeeModel.EmployeeLastName;
_temp.Salary = employeeModel.Salary;
_context.Update < Employees > (_temp);
model.Messsage = "Employee Update Successfully";
} else {
_context.Add < Employees > (employeeModel);
model.Messsage = "Employee Inserted Successfully";
}
_context.SaveChanges();
model.IsSuccess = true;
} catch (Exception ex) {
model.IsSuccess = false;
model.Messsage = "Error : " + ex.Message;
}
return model;
}
正如您在上面的代码中看到的,我们将员工模型作为参数。然后我们调用通过 id 获取详细信息的方法,通过 id 获取员工的详细信息并将其存储在临时变量中。
这里如果员工 ID 带有模型,这意味着我们必须更新员工,如果员工 ID 为空或零,那么我们就添加了一个新员工。
如果我们在临时变量中获得了数据,那么我们从参数模型中分配新数据并更新员工上下文,同时我们还将消息分配给响应模型。
如果我们得到的临时变量为空,那么我们将参数模型插入上下文中并在响应模型中传递消息。
最后,我们调用 context 的 save changes 方法来保存所有更改,例如 insert update,并将响应模型的 Is Success 属性设置为 true。如果发生任何错误,我们将 Is Success 属性更新为 false,并在 message 属性中传递错误消息。
删除员工方法
/// <summary>
/// delete employees
/// </summary>
/// <param name="employeeId"></param>
/// <returns></returns>
public ResponseModel DeleteEmployee(int employeeId) {
ResponseModel model = new ResponseModel();
try {
Employees _temp = GetEmployeeDetailsById(employeeId);
if (_temp != null) {
_context.Remove < Employees > (_temp);
_context.SaveChanges();
model.IsSuccess = true;
model.Messsage = "Employee Deleted Successfully";
} else {
model.IsSuccess = false;
model.Messsage = "Employee Not Found";
}
} catch (Exception ex) {
model.IsSuccess = false;
model.Messsage = "Error : " + ex.Message;
}
return model;
}
在删除方法中,我们将员工 ID 作为参数。然后调用服务方法通过 ID 获取详细信息并删除员工详细信息。
如果找到员工,则我们通过调用上下文的 remove 方法删除该员工,否则我们返回带有“未找到员工”消息的模型
在控制器中实现服务
现在我们的服务已经准备好了,所以现在我们在控制器中实现它。
步骤 1
通过右键单击“控制器”文件夹,然后单击“添加”再单击“控制器”来添加新控制器。
步骤2
现在从过滤器中选择 API,然后选择 API 控制器 - 空,然后单击添加按钮。
步骤3
现在给出一个合适的名称并单击添加按钮。
控制器的构造函数
在我们的控制器的构造函数中,我们为我们的服务实现依赖注入。
IEmployeeService _employeeService;
public EmployeeController(IEmployeeService service) {
_employeeService = service;
}
对于此控制器,我们使用带有操作方法的路由。例如,如果用户使用 Get 方法调用 Employee,它将调用 “获取所有员工列表”方法;如果用户使用 Get 方法调用 Employee/{id},它将调用“通过 Id 获取员工详细信息”方法 ;如果用户使用 POST 方法调用 Employee,它将调用“保存员工”方法;如果用户使用 Delete 方法调用 Employee,它将调用 “删除员工”方法。
获取所有员工列表方法
/// <summary>
/// get all employess
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("[action]")]
public IActionResult GetAllEmployees() {
try {
var employees = _employeeService.GetEmployeesList();
if (employees == null) return NotFound();
return Ok(employees);
} catch (Exception) {
return BadRequest();
}
}
在上述方法中,我们从服务中调用一个方法并将其赋值给变量。如果变量不为空,则返回 ok 状态,否则返回 not found。
通过 ID 方法获取员工详细信息
/// <summary>
/// get employee details by id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Route("[action]/id")]
public IActionResult GetEmployeesById(int id) {
try {
var employees = _employeeService.GetEmployeeDetailsById(id);
if (employees == null) return NotFound();
return Ok(employees);
} catch (Exception) {
return BadRequest();
}
}
保存员工方法
/// <summary>
/// save employee
/// </summary>
/// <param name="employeeModel"></param>
/// <returns></returns>
[HttpPost]
[Route("[action]")]
public IActionResult SaveEmployees(Employees employeeModel) {
try {
var model = _employeeService.SaveEmployee(employeeModel);
return Ok(model);
} catch (Exception) {
return BadRequest();
}
}
删除员工方法
/// <summary>
/// delete employee
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete]
[Route("[action]")]
public IActionResult DeleteEmployee(int id) {
try {
var model = _employeeService.DeleteEmployee(id);
return Ok(model);
} catch (Exception) {
return BadRequest();
}
}
使用 Swagger 测试 API
在创建此项目时,我们添加了开放的AI支持,因此当运行此项目时,它将打开Swagger页面,如下图所示。从这里我们可以测试我们的API。
添加新员工
展开“保存员工方法”,然后点击“立即尝试”按钮。现在 JSON 字段已可编辑,您可以像下面第一张图所示,在模型中添加数据,然后点击“执行”。在第二张图中,您可以看到表中的数据也已更新。
更新现有员工
在此请求中,我们传递与上一个请求中相同的模型,但在模型中,我们还传递了 id。
通过 ID 获取员工详细信息
获取员工列表
删除员工
如果员工不存在
结论
在本文中,我们使用 Entity Framework Core 创建了一个简单的员工 API。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。