首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

EF Core连接PostgreSQL数据库

编程知识
2024年08月07日 15:15

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)

From:https://www.cnblogs.com/mingupupu/p/18347247
本文地址: http://www.shuzixingkong.net/article/883
0评论
提交 加载更多评论
其他文章 (数据科学学习手札163)ibis:极具潜力的Python数据分析框架
本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,今天要给大家介绍的Python框架叫做ibis,没错,跟著名连锁酒店宜必思同名,其作者是创造了pandas、Arrow等著名
(数据科学学习手札163)ibis:极具潜力的Python数据分析框架 (数据科学学习手札163)ibis:极具潜力的Python数据分析框架 (数据科学学习手札163)ibis:极具潜力的Python数据分析框架
架构知识点(三)
动态分支预测是一种通过记录和分析程序运行时分支行为的历史信息来预测未来分支的机制。这种技术旨在提高处理器流水线的效率,减少分支指令引起的流水线停顿。你提到的通过查找指令地址判断分支行为的方法,就是一种动态分支预测的实现。 体现动态分支预测的几个关键点 历史信息记录: 记录分支行为:动态分支预测器会记
删库了不用跑路!binlog恢复数据实操
各位道友大家好呀! 想必道友们或多或少都听说过MySQL的binlog的作用,它记录了数据库整个的生命周期,可用于恢复数据或者从库同步数据。 那么如果发生了数据库误删,具体该怎样恢复数据呢? 下面就以一个例子来给道友们演示一下,让我们开始吧!do it! 数据备份 首先,数据库要定时进行备份,因为如
删库了不用跑路!binlog恢复数据实操 删库了不用跑路!binlog恢复数据实操 删库了不用跑路!binlog恢复数据实操
最佳实践:解读GaussDB(DWS) 统计信息自动收集方案
摘要:现在商用优化器大多都是基于统计信息进行查询代价评估,因此统计信息是否实时且准确对查询影响很大,特别是分布式数据库场景。本文详细介绍GaussDB(DWS)如何实现了一种轻量、实时、准确的统计信息自动收集方案。 本文分享自华为云社区《【最佳实践】GaussDB(DWS) 统计信息自动收集方案》,
最佳实践:解读GaussDB(DWS) 统计信息自动收集方案 最佳实践:解读GaussDB(DWS) 统计信息自动收集方案 最佳实践:解读GaussDB(DWS) 统计信息自动收集方案
AI 大模型时代呼唤新一代基础设施,DataOps 2.0和调度编排愈发重要
Bessemer Venture Partners 在基础设施投资方面有着悠久的历史。经过这家公司的长期观察,他们发现在 AI 时代,为 AI 量身定制的新型基础设施范式正在兴起,以增强 AI 时代下一波企业数据软件的发展。其中,DataOps 2.0 和调度编排技术和产业的发展也成为焦点。
AI 大模型时代呼唤新一代基础设施,DataOps 2.0和调度编排愈发重要 AI 大模型时代呼唤新一代基础设施,DataOps 2.0和调度编排愈发重要 AI 大模型时代呼唤新一代基础设施,DataOps 2.0和调度编排愈发重要
Kotlin 控制流和数组操作详解
Kotlin的`when`表达式提供了一种比`if..else`更清晰的方式来选择执行多个代码块之一,类似于Java的`switch`语句但更为强大和灵活。`while`循环允许在条件为真时重复执行代码块,而`do..while`循环则保证至少执行一次。`break`和`continue`可用于控制
获取客户端真实IP
出于安全考虑,近期在处理一个记录用户真实IP的需求。本来以为很简单,后来发现没有本来以为的简单。这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后,如何取得客户端的外网IP。 来自客户端PC的流量路径如上,在这样的拓扑中,在应用服务中取得,客户端P
获取客户端真实IP 获取客户端真实IP 获取客户端真实IP
再探GraphRAG:如何提升LLM总结能力?
本文对GraphRAG的灵感来源、能力透视、应用场景都做了比较优秀的解读,同时也对图技术的应用价值做了深入探讨,相信会给大家带来不一样的收获。
再探GraphRAG:如何提升LLM总结能力? 再探GraphRAG:如何提升LLM总结能力? 再探GraphRAG:如何提升LLM总结能力?