使用 ASP.NET Core 与 Entity Framework Core 进行数据库操作

ops/2024/9/20 1:31:04/ 标签: asp.net, 数据库, 后端

使用 ASP.NET Core 与 Entity Framework Core 进行数据库操作

Entity Framework Core(EF Core)是ASP.NET Core中的一个轻量级ORM框架,提供了以面向对象的方式与数据库进行交互的能力。本文将通过Visual Studio 2022详细介绍如何使用EF Core进行基本的数据库操作(CRUD),并展示一些进阶技巧,帮助初学者快速掌握该技术。

一、项目创建与配置

1. 创建ASP.NET Core Web API项目

  1. 打开Visual Studio 2022,选择“创建一个新项目”。
  2. 在项目模板中选择“ASP.NET Core Web API”,点击“下一步”。
  3. 为项目命名,例如EFCoreDemo,选择保存位置,然后点击“创建”。
  4. 在“附加信息”对话框中,确保目标框架为.NET 6.0或更高版本,然后点击“创建”。

2. 添加Entity Framework Core依赖项

在项目创建完成后,依次执行以下步骤来添加EF Core相关的NuGet包:

  1. 右键点击项目名称,选择“管理NuGet程序包”。
  2. 在“浏览”选项卡中搜索Microsoft.EntityFrameworkCore.SqlServer并点击“安装”。
  3. 继续搜索并安装Microsoft.EntityFrameworkCore.Tools

这些包将帮助我们与SQL Server数据库交互并进行数据库迁移操作。

二、创建数据库上下文和模型

1. 创建模型类

在EF Core中,模型类用于映射数据库表。假设我们需要管理一本简单的图书馆数据库,首先我们创建一个Book类:

  1. 右键项目,在“添加”菜单中选择“新建文件夹”,命名为Models
  2. Models文件夹下,右键选择“添加类”,命名为Book.cs,并定义如下内容:
namespace EFCoreDemo.Models
{public class Book{public int Id { get; set; }public string Title { get; set; }public string Author { get; set; }public DateTime PublishedDate { get; set; }public decimal Price { get; set; }}
}

2. 创建数据库上下文类

接下来,我们需要创建一个数据库上下文类LibraryContext,它将管理数据库连接并映射模型类到数据库表:

  1. 在项目根目录中创建一个新的文件夹命名为Data
  2. 右键点击Data文件夹,添加一个类命名为LibraryContext.cs,并定义如下内容:
using EFCoreDemo.Models;
using Microsoft.EntityFrameworkCore;namespace EFCoreDemo.Data
{public class LibraryContext : DbContext{public LibraryContext(DbContextOptions<LibraryContext> options) : base(options){}public DbSet<Book> Books { get; set; }}
}

3. 配置数据库连接字符串

appsettings.json文件中配置数据库连接字符串,确保你的SQL Server实例可以访问:

{"ConnectionStrings": {"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=LibraryDb;Trusted_Connection=True;MultipleActiveResultSets=true"},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}

然后在Program.cs中配置服务:

using EFCoreDemo.Data;
using Microsoft.EntityFrameworkCore;var builder = WebApplication.CreateBuilder(args);// 添加数据库上下文到服务容器
builder.Services.AddDbContext<LibraryContext>(options =>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));builder.Services.AddControllers();var app = builder.Build();app.MapControllers();app.Run();

三、执行数据库迁移

为了在数据库中创建相应的表结构,我们需要执行数据库迁移操作:

  1. 打开Visual Studio 2022中的“包管理器控制台”(工具 > NuGet 包管理器 > 包管理器控制台)。
  2. 输入以下命令来创建迁移并更新数据库
Add-Migration InitialCreate
Update-Database

Add-Migration命令会在项目中生成迁移文件,描述从空数据库到当前模型的变化。Update-Database命令则会根据迁移文件的定义在数据库中创建对应的表。

四、实现CRUD操作

1. 创建Controller

为了实现基本的CRUD操作,我们需要创建一个API控制器:

  1. 右键点击Controllers文件夹,选择“添加 > 控制器”。
  2. 选择“API控制器 - 使用Entity Framework”,并点击“添加”。
  3. 在对话框中,选择Book模型类和LibraryContext数据上下文类,然后点击“添加”。

Visual Studio会自动生成一个名为BooksController的控制器,其中包含了基本的CRUD操作代码。

2. 实现获取所有书籍的操作

在生成的BooksController中,GetBooks方法如下所示:

[HttpGet]
public async Task<ActionResult<IEnumerable<Book>>> GetBooks()
{return await _context.Books.ToListAsync();
}

该方法异步获取所有书籍记录,并返回给客户端。

3. 创建新书籍记录

PostBook方法用于创建新书籍:

[HttpPost]
public async Task<ActionResult<Book>> PostBook(Book book)
{_context.Books.Add(book);await _context.SaveChangesAsync();return CreatedAtAction("GetBook", new { id = book.Id }, book);
}

该方法接收一个Book对象,将其添加到数据库中,并返回创建的记录。

4. 更新书籍记录

PutBook方法用于更新现有书籍:

[HttpPut("{id}")]
public async Task<IActionResult> PutBook(int id, Book book)
{if (id != book.Id){return BadRequest();}_context.Entry(book).State = EntityState.Modified;try{await _context.SaveChangesAsync();}catch (DbUpdateConcurrencyException){if (!BookExists(id)){return NotFound();}else{throw;}}return NoContent();
}

该方法根据书籍ID更新对应的数据库记录。

5. 删除书籍记录

DeleteBook方法用于删除指定书籍:

[HttpDelete("{id}")]
public async Task<IActionResult> DeleteBook(int id)
{var book = await _context.Books.FindAsync(id);if (book == null){return NotFound();}_context.Books.Remove(book);await _context.SaveChangesAsync();return NoContent();
}

该方法根据ID找到对应的记录并删除。

五、进阶技巧

1. 使用数据迁移管理数据变化

在实际开发中,数据库结构可能会随着需求变化而演进。使用EF Core的迁移功能,可以轻松管理这些变化,而无需手动修改数据库表。

2. 处理并发冲突

在多人访问数据库的情况下,可能会发生并发冲突。EF Core提供了并发冲突检测机制,你可以通过捕获DbUpdateConcurrencyException来处理这些冲突,并决定如何解决。

3. 配置实体关系

EF Core支持多种关系映射,如一对多、多对多等。通过在模型类中定义导航属性并使用Fluent API或数据注解,你可以精确控制数据库表之间的关系。

六、总结

本文详细介绍了如何在ASP.NET Core中使用Entity Framework Core进行数据库操作,从项目的创建到基本的CRUD操作,并展示了一些进阶技巧。通过学习这些内容,初学者可以快速上手并逐步深入掌握EF Core的使用。同时,进阶部分提供了在实际开发中处理复杂数据库操作的一些思路和方法,希望能对你的开发工作有所帮助。


http://www.ppmy.cn/ops/102508.html

相关文章

在Android中的widge组件是什么?

目录 Widget 的特点 创建 Android Widget 的步骤 Widget 的主要功能 常见的 Widget 类型 总结 在 Android 中&#xff0c;Widget&#xff08;小部件&#xff09; 是一种特殊的 UI 组件&#xff0c;通常称为 "App Widget"。它是小型的、可以放置在设备主屏幕上的…

【区块链 + 司法存证】印记区块链电子印章 | FISCO BCOS应用案例

电子印章作为传统物理印章的数字化锚定&#xff0c;除了拥有和物理印章一样的法律效力外&#xff0c;还能够有效地为企业增效降 本提质。近年来&#xff0c;随着国家双碳目标的提出以及全球新冠疫情&#xff0c;进一步加速了企业数字化转型的步伐&#xff0c;电子印章 的价值也…

批量在多台Linux机器上安装OpenJDK

上一次我们实践了手动安装OpenJDK的过程&#xff0c;并且完成了用脚本一键安装的试验。但是本质上&#xff0c;我还是每台机器上单独进行操作。那这就产生了一个问题&#xff0c;如果我需要一次性在多台机器上部署安装&#xff0c;需要怎么操作呢。 问题分析 假设我的目的是在…

扁线电机介绍

相比于圆线&#xff0c;扁线因为扁平矩形的特殊性能够让线圈缠绕更加紧密&#xff0c;槽满率由原先的40%提升到70%。 这意味着相同体积下线圈中的导线更多&#xff0c;电流的传导效率更高&#xff0c;能够减少电阻损耗&#xff0c;产生的磁场更强&#xff0c;电机功率也就更大&…

IP地址与SSL证书:保障网络安全的关键

在数字时代&#xff0c;网络安全至关重要&#xff0c;而SSL&#xff08;安全套接层&#xff09;证书作为加密用户与服务器之间数据传输的利器&#xff0c;扮演着不可或缺的角色。然而&#xff0c;谈及SSL证书时&#xff0c;一个常见的误区是它们通常与域名绑定&#xff0c;而非…

【前端】理解与使用sessionStorage、localStorage与cookie

深入理解与高效使用 sessionStorage、localStorage 与 cookie 背景 在构建一个多页面的 Vue web 应用时&#xff0c;我面临了一个关键问题&#xff1a;如何有效地管理用户的登录状态。为了减少对服务器的不必要请求&#xff0c;我尝试了全局状态注入的方法&#xff0c;但这种…

【通俗理解】深度学习特征提取——Attention机制的数学原理与应用

【通俗理解】深度学习特征提取——Attention机制的数学原理与应用 关键词提炼 #深度学习 #特征提取 #Attention机制 #CNN #Transformer #关联特征 #MLP #拟合处理 第一节&#xff1a;Attention机制的类比与核心概念 1.1 Attention机制的类比 Attention机制可以被视为一个“特…

【kafa系列】kafka如何保证消息不丢失

【kafa系列】kafka如何保证消息不丢失 Apache Kafka通过多种机制来确保消息不丢失&#xff0c;这些机制包括但不限于副本机制、ISR&#xff08;In-Sync Replicas&#xff09;机制、ACK&#xff08;Acknowledgment&#xff09;机制、幂等生产者&#xff08;Idempotent Producer&…

K8S对接Ceph分布式存储

文章目录 一、Ceph理论知识1、Ceph简介2、Ceph分布式存储的优点3、Ceph核心组件 二、部署Ceph高可用集群1、服务器环境信息2、部署前环境准备工作3、部署Ceph监控服务Monitor4、激活Ceph存储服务OSD 三、K8S对接Ceph存储1、K8S对接Ceph RBD实现数据持久化2、基于Ceph RBD生成PV…

计算机视觉编程 1(图片处理)

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

计算机毕业设计推荐-基于python的个性化旅游路线推荐平台

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的个性化旅游路线…

ubuntu20 安装ros noetic版本

【ROS】Ubuntu20.04卸载重装ROS_ubuntu20.04卸载ros-CSDN博客 错误处理——rosdep init&#xff0c;rosdep update失败解决方案_rosdep init出错-CSDN博客 ubuntu 20.04解决在处理时有错误发生&#xff1a; /var/cache/apt/archives/python3-catkin-pkg-modules_0.4.24-1_all…

NoSQL数据库-Redis集群详解及案例实现

一、 关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 D…

基于JAVA的专利资源共享平台

项目介绍 基于JAVA的专利资源共享平台系统是一个集专利信息展示、资源共享、交易服务等功能于一体的综合性平台。该系统利用JAVA语言的强大功能和广泛的生态系统&#xff0c;结合数据库技术、Web开发技术等&#xff0c;为用户提供了一个高效、安全、便捷的专利资源共享和交易环…

【C++】日期和时间

C 提供了多种处理日期和时间的功能&#xff0c;主要通过标准库 <ctime> 和 <chrono> 提供。以下是 C 中处理日期和时间的功能介绍及其用法&#xff1a; 1. <ctime> 库 <ctime> 是 C 中处理时间的传统库&#xff0c;提供了一些基本的时间操作函数。这…

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型&#xff0c;快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程&#xff0c;将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。 亚马逊云科技开发者社区为开发者们提供全球的…

SD三分钟入门!秋叶大佬24年8月最新的Stable Diffusion整合包V4.9.7来了~

先感谢赛博菩萨秋葉大佬&#xff0c;开发绘世启动器&#xff0c;**8月15日更新了秋叶整合包最新版本4.9。**文末有安装包&#xff01;&#xff01; SD整合包可以扫描下方,免费获取 1 什么是 Stable Diffusion&#xff1f; Stable Diffusion&#xff08;简称SD&#xff09;是…

一键编译QT5源码脚本(交叉编译arm64、mips64版本)

前言 这几天为了编写国产专用机上的软件&#xff0c;又盘起了交叉编译.. 一开始想使用深度最新的deepin 23正式版做系统&#xff0c;搭建编译环境。然而交叉编译链工具直接安装失败&#xff01; 然后又装了Debian12原版系统&#xff0c;编译环境倒是顺利搭建起来&#xff0c…

DDIA 分布式数据的分区与复制 - 基于 Redis、Kafka、Elasticsearch 的深入分析

引言 本文基于《Designing Data-Intensive Applications》一书&#xff08;设计数据密集型应用&#xff0c;简称 DDIA&#xff09;&#xff0c;深入探讨了 Redis、Kafka 和 Elasticsearch 等常用组件的分区与复制机制。通过这些案例分析&#xff0c;我们可以更好地理解分布式系…

Java Web实战教程:如何一步步开发美容美发管理系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…