ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

简介: 原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置和初始化数据库,以及如何创建迁移代码和应用迁移代码。

原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core 使用 EF 框架查询数据

上一章节我们学习了如何设置和初始化数据库,以及如何创建迁移代码和应用迁移代码。本章节我们就学习如何使用 EF 框架来查询数据库,至于添加和修改,后面的章节中我们会慢慢学习到

添加测试数据

我们首先使用 SQLite Studio 添加三条数据

ID Name
1 李白
2 杜甫
3 白居易
  1. 使用 SQLite Studio 打开我们的 blogging.db 数据库,双击左边的 Employees

  2. 然后点击上面的 数据( Data ) 后会显示 Employees 中的数据,因为没有任何数据,所以是空的

  3. 然后点击 绿色 的加号,就会出现一个表格编辑框

  4. 不用犹豫,双击第一个 NULL ,输入 1 ,然后双击第二个 NULL ,输入 李白 ,就这样

  5. 然后点击绿色的勾号,就这样,第一条数据添加成功了,如此,把剩下的两条也添加了吧,最后结果如下

显示数据

如果这时候直接重启我们的应用并刷新浏览器,会提示数据库不存在

因此我们需要更改下 HomeController,添加一个构造函数和属性

private readonly HelloWorldDBContext _context;

public HomeController(HelloWorldDBContext context) { _context = context; } 

然后再修改 Index 方法使用我们的 _context 属性

public ViewResult Index()
{

    var model = new HomePageViewModel(); SQLEmployeeData sqlData = new SQLEmployeeData(_context); model.Employees = sqlData.GetAll(); return View(model); } 

修改完成后全部的代码如下

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic; using System.Linq; using HelloWorld.Models; namespace HelloWorld.Controllers { public class HomeController: Controller { private readonly HelloWorldDBContext _context; public HomeController(HelloWorldDBContext context) { _context = context; } public ViewResult Index() { var model = new HomePageViewModel(); SQLEmployeeData sqlData = new SQLEmployeeData(_context); model.Employees = sqlData.GetAll(); return View(model); } } public class SQLEmployeeData { private HelloWorldDBContext _context { get; set; } public SQLEmployeeData(HelloWorldDBContext context) { _context = context; } public void Add(Employee emp) { _context.Add(emp); _context.SaveChanges(); } public Employee Get(int ID) { return _context.Employees.FirstOrDefault(e => e.ID == ID); } public IEnumerable<Employee> GetAll() { return _context.Employees.ToList<Employee>(); } } public class HomePageViewModel { public IEnumerable<Employee> Employees { get; set; } } } 

保存 HomeController.cs,重启我们的应用并刷新浏览器,继续报错

这个错误的原因是我们返回的是列表数据,但我们模板却当作返回了一个 Employee 实例

修改 Home/Index.cshtml 文件,改成循环列表来显示所有的数据

@model HelloWorld.Controllers.HomePageViewModel 
<!DOCTYPE html>
<html>
<head> <meta charset="utf-8" /> <title>Home 控制器下的 Index 方法</title> </head> <body> <h1>欢迎!</h1> <div>这个消息来自 Home 控制器下的 Index 的视图文件 index.cshtml </div> <table> @foreach (var employee in Model.Employees) { <tr> <td>@employee.ID</td> <td>@employee.Name</td> </tr> } </table> </body> </html> 

保存 Home/Index.cshtml,刷新浏览器,显示如下,终于列出了所有的数据

员工详情

刚刚我们终于成功的使用 EF 框架从 SQLite 数据库中读取了所有的员工信息,现在,我们再制作一个页面来读取员工的详细信息

比如 1 号员工的详情页面为 /Home/Detail/1,2 号员工的详情页面为 /Home/Detail/2

这是符合我们在 Startup 类中默认的路由器的

routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");

在这种 URL 格式下,那么路由器中的属性 id 会被赋值为 12

我们首先修改下 Home/Index.cshtml 模板,给 ID 列添加链接

@model HelloWorld.Controllers.HomePageViewModel 
<!DOCTYPE html>
<html>
<head> <meta charset="utf-8" /> <title>Home 控制器下的 Index 方法</title> </head> <body> <h1>欢迎!</h1> <div>这个消息来自 Home 控制器下的 Index 的视图文件 index.cshtml </div> <table> @foreach (var employee in Model.Employees) { <tr> <td><a href="/Home/Detail/@employee.ID">@employee.ID</a></td> <td>@employee.Name</td> </tr> } </table> </body> </html> 

保存 Home/Index.cshtml,刷新浏览器,显示如下

如果我们随便点击一个员工的 id,比如 1 把,则会提示错误,提示没找到该页面

好吧,我们回到 HomeController,添加一个 Detail 方法

public ViewResult Detail(int id) { var model = new HomePageViewModel(); SQLEmployeeData sqlData = new SQLEmployeeData(_context); Employee employee = sqlData.Get(id); return View(employee); } 

代码几乎和 Index 一样除了以下几点

  1. 首先是参数部分,参数多了一个 int 类型的 id ,这个 id 和路由器的 id 是同一个意思

    routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");

    路由器中除了 controlleraction 之外的所有参数,都会按照顺序传递给处理方法

    而且会强制转换为方法参数的类型,比如刚刚访问的是 /Home/Detail/1,那么 1 这个路由参数就会被赋值给路由参数 id,然后会传递给 Detail 方法,并转换为 int 类型

  2. 因为我们要获取的是详情,所以就不能使用 GetAll() 方法而是使用 Get 方法,Get 方法要么返回空,要么返回一个 Employee 的实例

保存 HomeController,重启应用程序,刷新浏览器,报错如下,提示模板没有找到

那我们就创建一个模板呗,在 Views/Home 目录下新建一个 Detail.cshtml 文件,输入以下内容

<!DOCTYPE html>
<html>
<head> <meta charset="utf-8" /> <title>Home 控制器下的 Detail 方法</title> </head> <body> <h1>欢迎!</h1> <div>这个消息来自 Home 控制器下的 Detail 的视图文件 Detail.cshtml</div> <p><a href="/">返回首页</a></p> <table> <tr> <td>员工编号</td> <td>@Model.ID</td> </tr> <tr> <td>员工姓名</td> <td>@Model.Name</td> </tr> </table> <p><a href="/">返回首页</a></p> </body> </html> 

保存 Home/Detail.cshtml,刷新浏览器,显示如下

目录
相关文章
|
3天前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
18 7
|
3天前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
32 1
|
16天前
|
存储 开发框架 算法
ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
|
12天前
.net 框架基础
.net 框架基础
15 0
|
16天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
26 0
|
16天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
20天前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
72 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
137 0
|
4月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
62 0
|
4月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
234 5

相关实验场景

更多
下一篇
云函数