使用 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。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
小先生8125 天前
.NET Core后台任务队列
.net·.netcore
MoFe15 天前
【.net core】【watercloud】动态数据转换为静态表格,或者表格数据返回需要后处理
.netcore
吹牛不交税10 天前
.netcore项目部署在ubuntu22.04虚拟机的docker中的过程记录
docker·容器·.netcore
weixin_4219947814 天前
基于 .NET 9.0 的高性能轻量级令牌桶限流服务
.net·.netcore·令牌桶
weixin_4219947814 天前
MVC 模式初探
mvc·.net·.netcore
weixin_4219947815 天前
互联网与 Web 应用简介
.net·.netcore
全栈小517 天前
【C#】合理使用DeepSeek相关AI应用为我们提供强有力的开发工具,在.net core 6.0框架下使用JsonNode动态解析json字符串,如何正确使用单问号和双问号做好空值处理
人工智能·c#·json·.netcore·deepseek
时光追逐者19 天前
C#/.NET/.NET Core优秀项目和框架2026年1月简报
c#·.net·.netcore
大尚来也21 天前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
postgresql·sqlite·.netcore
吹牛不交税21 天前
admin.net-v2 框架使用笔记-netcore8.0/10.0版
vue.js·.netcore