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

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

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

http://www.dtcms.com/a/414484.html

相关文章:

  • 网站建设前的分析公司概况了解google seo是什么啊
  • 【C++实战㊾】C++11新特性实战:nullptr与类型推导,解锁编程新姿势
  • Python笔记之Python中的`@`装饰器总结笔记
  • 存储器映射寄存器MMR(Memory-Mapped Register)
  • 【Big Data】DataX 3.0 星型数据链路架构的实践与价值
  • 芯片和半导体:三星发动2nm工艺价格战
  • NLP:讲解Bert模型的变体
  • wordpress成品站源码义乌网站建设九
  • 高通平台WiFi学习--- WLAN 进阶:无需开启 WiFi 也能使用 P2P 功能的实现与探索
  • 【论文笔记】基于深度学习的图像分割研究综述 和 基于深度学习的二分图像分割综述
  • 【足式机器人算法】#2 奖励函数设计
  • 机器人小脑的控制算法有哪些 ?
  • 网站程序上传教程wordpress 微媒体插件
  • 小米投下语音AI“核弹”:MiMo-Audio开源,语音领域的“GPT-3时刻”来了
  • 交易猫假网站制作wordpress 安装目录
  • C++ 类型推导(第三部分)
  • 彩票网站注册软件开发外包合同模板
  • 社区互助养老系统|基于java和小程序的社区互助养老系统小程序设计与实现(源码+数据库+文档)
  • 通用智能过滤器使用指南:提升Django Admin数据筛选体验
  • 用友加密狗注册网站嘉兴网页制作公司
  • 我找伟宏篷布我做的事ko家的网站网站建设谈判技巧
  • 【基础软件专项训练营】笔记
  • 地平线机器人具身导航快慢推理新探索!FSR-VLN:基于分层多模态场景图快慢推理的视觉语言导航
  • [分享] 千呼万唤始出来《WX小程序反编译教程》
  • 网站建设费用模板印象笔记同步wordpress
  • DAY 04 CSS文本,字体属性以及选择器
  • Java-136 深入浅出 MySQL Spring Boot @Transactional 使用指南:事务传播、隔离级别与异常回滚策略
  • 直接选择排序、堆排序、冒泡排序
  • 单页面网站设计网站欣赏软文是什么
  • Nginx 如何启用 HSTS 以加强网络安全 ?