EF Core连接PostgreSQL数据库

news2024/9/22 23:37:25

PostgreSQL数据库介绍

PostgreSQL是一个功能强大的开源对象关系型数据库管理系统(RDBMS)。最初于1986年在加州大学伯克利分校的POSTGRES项目中诞生,PostgreSQL以其稳定性、灵活性和扩展性而著称。它支持丰富的数据类型、复杂的查询、事务完整性、多版本并发控制(MVCC)、存储过程等高级功能。

PostgreSQL完全遵循SQL标准,支持ACID属性(原子性、一致性、隔离性、持久性),适用于高并发和数据量大的应用场景。此外,它具有广泛的可扩展性,允许用户定义自己的数据类型、索引方法、函数、操作符等。PostgreSQL的强大社区不断提供支持和扩展,使其在不断发展的数据库技术中保持竞争力。被广泛应用于数据分析、金融服务、Web开发等领域。

官网地址:https://www.postgresql.org

GitHub地址:https://github.com/postgres/postgres

image-20240807140547880

PostgreSQL:The World’s Most Advanced Open Source Relational Database.

PosegreSQL:世界上最先进的开源关系型数据库。

Entity Framework Core介绍

EF Core是专为.NET设计的现代化对象数据库映射器。它支持LINQ查询,变更跟踪,更新以及模式迁移。EF Core支持与SQL Server,Azure SQL数据库,SQLite,Azure Cosmos DB,MySQL,PostgreSQL以及通过提供程序插件接口的集成其他数据库。

通过EF Core,开发者能够更高效地开发数据驱动的应用程序,适用于Web应用、桌面应用、微服务等多种应用场景。其不断更新的版本和活跃的社区支持,使其成为.NET开发者首选的ORM框架之一。

GitHub地址:https://github.com/dotnet/efcore

文档地址:https://learn.microsoft.com/zh-cn/ef/core

image-20240807141748135

实践

IDE:Visual Studio 2022

.NET版本:.NET 8

新建一个Web Api项目。

本次实践需要用到3个包:

image-20240807142146162

image-20240807142204223

image-20240807142227059

第一个就是EF Core。

第二个Microsoft.EntityFrameworkCore.Tools 是一个为 Entity Framework Core 提供命令行工具支持的 NuGet 包。这个工具包主要用于数据库迁移的创建、更新和管理,生成数据库上下文类和实体类等。通过使用该工具,开发者可以从命令行或包管理器控制台执行操作,如创建新迁移、应用迁移、生成数据库脚本等。这有助于在开发过程中保持数据库模式与代码模型的一致性。

第三个Npgsql.EntityFrameworkCore.PostgreSQL 是一个用于将 Entity Framework Core(EF Core)与 PostgreSQL 数据库结合使用的提供程序包。它为 EF Core 提供了对 PostgreSQL 数据库的支持,使开发者能够使用 EF Core 的功能来处理 PostgreSQL 数据库中的数据。通过这个包,开发者可以使用 LINQ 查询、自动迁移、模型验证等 EF Core 特性,并且可以利用 PostgreSQL 特有的功能,如 JSONB 数据类型、全文搜索、数组等。

GitHub地址:https://github.com/npgsql/efcore.pg

首先在项目根目录创建一个名为Data的文件夹,创建一个AppDbContext类。

image-20240807143755865

先大体上总览一下这个类:

image-20240807143914379

首先它继承自DbContext类。

在 Entity Framework Core(EF Core)中,DbContext 类是核心组件之一,负责管理与数据库的所有交互。它充当应用程序与数据库之间的桥梁,提供了查询数据库、保存数据以及配置模型的功能。

主要功能和角色

  1. 数据访问和查询DbContext 提供了一组方法和属性,允许开发者使用 LINQ 查询数据库。通过访问 DbSet<TEntity> 属性,可以对特定实体类型执行查询操作。
  2. 对象追踪和变更检测DbContext 追踪从数据库中检索到的实体对象的状态。当对象的状态发生变化时(如被修改、添加或删除),DbContext 负责记录这些变化,并在调用 SaveChanges() 方法时,将这些变化应用到数据库中。
  3. 事务管理DbContext 支持事务的管理,通过 SaveChanges() 方法确保数据库操作的原子性,即所有的操作要么全部成功,要么全部回滚。
  4. 模型配置DbContext 允许通过覆盖 OnModelCreating 方法来配置实体模型与数据库表之间的映射关系。这包括设置主键、索引、外键关系、约束等。
  5. 生命周期管理DbContext 是一个可配置的类,其生命周期管理可以根据需要进行配置。通常,它在请求或操作的范围内被创建和释放,以确保数据库连接的有效管理。

还有一个类型为IConfiguration的属性,它通过构造函数注入。IConfiguration 是一个接口,主要用于获取应用程序的配置数据。它提供了一种标准化的方式来访问应用程序的配置信息,例如连接字符串、应用设置、外部服务的密钥等。IConfiguration 允许开发者从各种来源(如 JSON 文件、环境变量、命令行参数等)读取配置,并将这些配置统一映射到一个结构化的对象中。

在Web Api中,我们一般把一些配置写在appsettings.json中。

image-20240807144847765

本示例的appsettings.json如下所示:

image-20240807145043754

存储了PostgreSQL的连接字符串。

在OnConfiguring方法中进行连接字符串的配置。

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder.UseNpgsql(Configuration.GetConnectionString("SKApiDatabase"));
 }

现在新建一个Student类:

 public class Student
 {
     public int Id { get; set; }
     public string? Name { get; set; }
     public string? Home { get; set; }
 }

在AppDbContext类中添加Student表:

 public DbSet<Student> Students { get; set; }

我们使用的是Code First。“Code First” 是 Entity Framework(包括 Entity Framework Core)中一种开发模式,它的主要思想是通过定义应用程序的领域模型(通常使用类)来创建和管理数据库架构。这种方法强调首先编写代码来定义数据模型,而数据库的表结构则是由这些数据模型自动生成和维护的。

  1. 领域模型的定义:在 Code First 模式中,开发者首先定义领域模型,即使用类和属性来表示数据库中的实体和关系。通过注解(数据注解属性)或流畅的API(Fluent API),开发者可以指定数据库表、列、主键、外键、索引等数据库结构信息。
  2. 数据库上下文类:定义一个继承自 DbContext 的类,它包含了对实体的 DbSet<TEntity> 属性。这些属性对应数据库中的表,DbContext 类还负责管理数据访问和对象的生命周期。
  3. 迁移:EF Core 提供了迁移(Migration)工具,可以根据代码中的模型变更生成和应用数据库更新脚本。迁移可以帮助开发者将数据库架构从一个版本升级到另一个版本,同时保留数据。
  4. 自动生成数据库:在应用程序运行时,EF Core 可以根据定义的模型自动生成数据库架构。如果数据库已经存在,EF Core 可以检查和应用迁移来更新数据库。

优点

  1. 开发效率高:开发者可以专注于代码开发,而不需要直接编写 SQL 脚本来定义数据库结构。
  2. 易于维护:模型的变化可以通过代码和迁移工具方便地同步到数据库。
  3. 类型安全:代码和数据库模型是紧密绑定的,减少了由于不匹配导致的错误。

缺点

  1. 对复杂数据库的支持:对于已有的大型复杂数据库,Code First 可能不太合适,特别是在处理特定的数据库优化和配置时。
  2. 性能问题:自动生成的SQL可能没有手工优化的SQL高效。

总的来说,Code First 模式是一种简化开发和维护数据库架构的有效方法,特别适合于从头开始的新项目。

现在就需要用到Microsoft.EntityFrameworkCore.Tools了,打开程序包管理器控制台,输入

Add-Migration "备注信息"

image-20240807150340099

成功之后,会发现项目根目录多了个Migrations文件夹:

image-20240807150425459

Migrations 文件夹用于存放由迁移工具生成的迁移文件。这些文件记录了数据库架构的变更历史,使得开发者可以管理和应用这些变更,以保持数据库与代码模型之间的一致性。具体来说,Migrations 文件夹及其内容的作用包括以下几个方面:

  1. 跟踪数据库架构的变更: 每当开发者对领域模型(实体类)或数据库上下文类进行修改(如添加新实体、修改属性类型等)并生成迁移时,EF Core 会在 Migrations 文件夹中创建一个新的迁移文件。这个文件包含了描述数据库如何从一个状态变更到另一个状态的指令。
  2. 生成和维护迁移脚本: 迁移文件中包含两个主要部分:Up 方法和 Down 方法。Up 方法定义了应用迁移时执行的操作,例如创建表、添加列等。而 Down 方法则定义了撤销这些变更的操作。通过这些方法,EF Core 可以生成适用于不同数据库提供程序的 SQL 脚本,以便在数据库中执行相应的变更。
  3. 应用迁移到数据库: 通过 Update-Database 命令或代码中的 context.Database.Migrate() 方法,EF Core 会依次应用 Migrations 文件夹中的迁移,更新数据库架构。这有助于在开发、测试和生产环境中保持数据库的一致性。
  4. 版本控制和协作: 迁移文件是普通的代码文件,可以纳入版本控制系统(如 Git)。这使得团队成员可以方便地跟踪数据库架构的变更,回顾和讨论不同版本之间的差异。

打开20240806093127_init类看看:

image-20240807150949302

就像上面第二点说的一样,包含两个主要部分:Up 方法和 Down 方法。Up 方法定义了应用迁移时执行的操作,

Down 方法则定义了撤销这些变更的操作。

打开程序包管理器控制台,输入

Update-Database

image-20240807151439774

现在打开pg Admin:

image-20240807151510445

pgAdmin 是一个用于管理 PostgreSQL 数据库的开源图形化用户界面工具。它提供了一个友好的界面,帮助用户执行数据库管理任务、编写和执行SQL查询、监控数据库状态等。pgAdmin 适用于各种平台,包括 Windows、macOS 和 Linux。

发现我们的数据库中成功生成了两张表:

image-20240807151824560

一张是在AppDbContext类中定义的Students表,一张是自动生成的用于记录迁移历史的__EFMigrationsHistory表。

以上就成功在Web Api中使用EF Core连接到PostgreSQL数据库了,接下来就可以开始愉快地CRUD了。

参考

1、Setup PostgreSQL in .NET with Entity Framework (youtube.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言进阶(3)

1.数组传参 一维数组传参的时候使用数组名&#xff0c;代表数组首元素的地址&#xff1b;函数接受时形参可以是数组形式&#xff0c;也可能是指针形式&#xff0c;数组形式比较简单数组怎么写&#xff0c;函数接受是就怎么接受,使用指针就要将指针类型写清楚&#xff0c;如下 …

一文搞懂MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系

MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM各个系统到底是什么意思&#xff1f;今天一文就给大家分享&#xff01; 在企业管理中&#xff0c;各种信息系统扮演着至关重要的角色&#xff0c;它们如同企业的神经系统&#xff0c;确保各个部分高效协同运作。 MES&#…

微信小程序项目开发【从0到1~入门篇】

创建第一个小程序 1、小程序简介2、第一个小程序&#xff1a;注册小程序开发账号3、第一个小程序&#xff1a;安装开发者工具3.1 了解微信开发者工具3.2下载安装3.3 扫描登录 4、创建小程序项目5、小程序代码的构成5.1json配置文件5.2WXML模板5.3WXSS样式5.4JS 逻辑交互 6、宿主…

HDMI线连接显示器后色彩灰暗问题解析与解决方案

随着科技的快速发展&#xff0c;HDMI线已成为连接电脑与显示器的重要工具。然而&#xff0c;当HDMI线连接显示器后&#xff0c;有时会遇到显示器色彩灰暗的问题。本文将针对这一问题进行深入解析&#xff0c;并提供相应的解决方案。 一、HDMI线连接显示器后色彩灰暗的原因 1. …

C++ SQL ORM

测试代码 // // Created by www on 2024/8/7. // #include "sqlitepp/database.h" #include "sqlitepp/condition.h"#include <iostream> using namespace sqlitepp; using namespace sqlitepp::literals;enum class test_enum {hello };void test…

Matplotlib | 绘制折线图

目录 简介安装 Matplotlib开始绘制简单折线图改变线的样式改变节点的样式添加图表文字改变坐标轴标签改变坐标数值范围绘制多条折线实践&#xff1a;绘制温度变化图 简介 折线图&#xff08;Line Chart&#xff09;&#xff0c;是一种以折线来呈现数据随时间变化而变化的图表。…

上翘机头设计确保了机器人在与杆子正面碰撞后,平稳从水平飞行状态重新调整为垂直飞行状态,进而用翅膀紧紧抱住杆子,实现稳定的栖息

带翼无人驾驶飞行器&#xff08;UAV&#xff09;因其出色的单位质量续航能力&#xff0c;特别适用于远距离任务&#xff0c;如送货、测绘和搜索救援。然而&#xff0c;与有翼飞行动物相比&#xff0c;它们在复杂结构上的着陆或栖息能力受限&#xff0c;难以执行检查、操作、监控…

for循环中的setTimeout的几种情况

for循环中的setTimeout的几种情况 在做js相关的题目时&#xff0c;经常会遇到以下几种容易混淆的setTimeout相关的题目&#xff1a; 第一种 for(var i0;i<10;i){setTimeout(console.log(i),0); }在这个代码片段中&#xff0c;setTimeout 的第一个参数是 console.log(i)&…

Qt QTableWidget 去除序号列

ui->tableWidget->verticalHeader()->setHidden(true);//垂直序列号&#xff08;表左侧&#xff09;ui.tableWidget->horizontalHeader()->setHidden(true);//水平序列号&#xff08;表上方&#xff09;删除后效果图&#xff1a;

Aurora64B 66B IP的原理及示例工程分析(高速收发器二十四)

点击进入高速收发器系列文章导航界面 1、Aurora 64B/66B原理 Aurora 64B/66B的原理与Aurora 8B/10B的原理基本上一致&#xff0c;通道概述如下所示。 图1 Aurora 64B/66B概述 上图的Aurora 64B/66B Core就是该IP&#xff0c;一个IP可以驱动多个高速收发器&#xff0c;该内核的主…

虚拟机(VMware16)安装rocky9.2详细过程,附镜像下载链接

rocky官方站点 链接: 官方站点 rocky9.2镜像下载路径 链接: Rocky-x86_64-dvd.iso 打开虚拟机&#xff0c;选择新建虚拟机 新建虚拟机 选择典型 由于VMware16没有rocky的版本&#xff0c;所以我们这里选择其他liunx 5.x 内核 64位 因为rocky9默认内核版本就是5开头的&#xf…

高频焊机逆变电路谐波计算及分析

一、SPWM谐波分析 简化高频焊机逆变模块为图4-6的单相PWM逆变电路。它由一个大小为u0的直流电压源和两个桥臂组成&#xff0c;每个桥臂包括两个MOSFET全控器件&#xff0c;阻抗Z模块为逆变输出负载[26]。逆变控制器的控制算法为双极性SPWM算法&#xff0c;即通过正弦调制波和三…

Unity Addressables bundle依赖查看和资源重复查看工具

在开发的过程有时候想要知道addressables 打包出来bundles的依赖关系&#xff0c;以及资源的重复情况。直接通过自带的addressables工具查看有点困难。这里分享一个github上的开源工具。名称为UnityAddressablesBuildLayoutExplorer。该工具可以帮助查看所有文件的依赖情况&…

在Visual Studio/Qt Creator 中使用CMake安装和使用vcpkg包

文章目录 0. vcpkg简介和安装0.1 vcpkg简介0.2 vcpkg安装0.2.1 如何在Visual Studio 2022以及以上版本中安装vcpkg0.2.2 在其他VS版本或Qt Creator等平台上中安装vcpkg 1. 在Visual Studio 中使用CMake安装和使用vcpkg包1.1 创建Visual Studio项目1.2 设置项目文件a. 配置CMake…

线性方程组迭代算法的Python实现

更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xff1a; ABAQUS数值模拟相关Python科学计算开源框架&#xff0c;编程…

pip 安装 scikit-learn

第一步&#xff1a;更新pip 可以首先执行 python -m ensurepip 然后执行 python -m pip install --upgrade pip 即可更新完毕。 python -m ensurepip python -m pip install --upgrade pip第二步 安装sklearn的时候一定要注意顺序。 安装顺序&#xff1a;numpy / scipy / ma…

汇编语言入门基础(访问寄存器和内存)

目录 访问寄存器和内存 2.1 寄存器是CPU内部的信息存储单元 2.1.1 通用寄存器--以AX为例 2.1.2 将AX分成AH与AL 2.2 “字”再寄存器中的存储 2.3 mov和add指令 2.3.1 练习1 2.3.2 练习2 2.4 确定物理地址的方法 2.4.1 物理地址 2.4.2 8086CPU给出物理地址的方法 2.4.…

swin和vit

参考&#xff1a;https://blog.csdn.net/weixin_44878336/article/details/125444556 Swin Transformer与Vision Transformer的对比 二者的不同之处&#xff1a; Swin-Transformer所构建的特征图是具有层次性的&#xff0c;很像我们之前将的卷积神经网络那样&#xff0c;随着…

基于检索增强生成 (RAG) 的大语言模型优化研究

复旦大学的研究人员对检索增强生成技术 (RAG) 的现有方法进行了系统性的研究&#xff0c;提出了一种三步式方法来优化 RAG 框架&#xff0c;并通过实验证明了该方法在提高大型语言模型性能方面的有效性&#xff0c;特别是在多模态检索和问答方面的应用。 论文介绍 基于检索的…

HexView 刷写文件脚本处理工具-基本功能介绍(二)-导入文件

菜单 保存(Save) 在对数据进行任何修改后(例如修改十六进制行或块的基地址),保存选项将被启用。这表示文件已被修改。在这种情况下,“保存”选项允许你将数据存储到当前文件名中。Hexview会以当前文件格式写入数据。当前文件格式显示在状态行中。 另存为(Save as) 允…