EF Core连接PostgreSQL数据库

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: EF Core连接PostgreSQL数据库

PostgreSQL数据库介绍

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

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

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

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

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

实践

IDE:Visual Studio 2022

.NET版本:.NET 8

新建一个Web Api项目。

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

第一个就是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类。

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

首先它继承自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中。

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

存储了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 "备注信息"

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

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类看看:

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

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

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

Update-Database

现在打开pg Admin:

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

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

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

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

参考

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

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
24天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构涵盖数据库集群、数据库、表、索引、视图等对象,每个对象有唯一的oid标识。数据库集群包含多个数据库,每个数据库又包含多个模式,模式内含表、函数等。通过特定SQL命令可查看和管理这些数据库对象。
|
25天前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
24天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
26天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的数据库集群
PostgreSQL的逻辑存储结构涵盖了数据库集群、数据库、表、索引、视图等对象,每个对象都有唯一的oid标识。数据库集群是由单个PostgreSQL实例管理的所有数据库集合,共享同一配置和资源。集群的数据存储在一个称为数据目录的单一目录中,可通过-D选项或PGDATA环境变量指定。
|
1月前
|
关系型数据库 分布式数据库 数据库
PostgreSQL+Citus分布式数据库
PostgreSQL+Citus分布式数据库
63 15
|
23天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
24天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
24天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
39 1
|
13天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
87 15
下一篇
DataWorks