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

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

相关推荐
小先生8123 小时前
.NET Core项目中 Serilog日志文件配置
c#·.netcore
爱吃香蕉的阿豪3 小时前
.NET Core 中 System.Text.Json 与 Newtonsoft.Json 深度对比:用法、性能与场景选型
数据库·json·.netcore
csdn_aspnet3 小时前
ASP.NET Core 10.0 的主要变化
.netcore
csdn_aspnet3 天前
在 C# .NETCore 中使用 MongoDB(第 1 部分):驱动程序基础知识和插入文档
mongodb·.netcore
csdn_aspnet4 天前
在 C# .NETCore 中使用 MongoDB(第 3 部分):跳过、排序、限制和投影
mongodb·c#·.netcore
csdn_aspnet5 天前
在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档
mongodb·c#·.netcore
csdn_aspnet7 天前
.NET Core 中 RabbitMQ 和 MassTransit 的使用
rabbitmq·.netcore·masstransit
csdn_aspnet17 天前
MongoDB C# .NetCore 驱动程序 序列化忽略属性
mongodb·c#·.netcore
Tiger_shl19 天前
【.Net技术栈梳理】08-控制反转(IoC)与依赖注入(DI)
开发语言·.net·.netcore