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)

EF Core连接PostgreSQL数据库的更多相关文章

  1. 第八节:EF Core连接MySql数据库

    一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...

  2. .net core使用EF core连接mssqlserver数据库

    一,打开控制台二,输入以下代码1.Install-Package Microsoft.EntityFrameworkCore 2.Install-Package Microsoft.EntityFra ...

  3. Entity Freamwork 6连接PostgreSql数据库

    原文 Entity Freamwork 6连接PostgreSql数据库 开发环境 VS 2015  Update 1   Postgre Sql 9.4 使用过程 1.使用Nuget在项目中添加对E ...

  4. 使用EF CodeFirst连接MySql数据库

    如何使用EF CodeFirst连接MySql数据库? 我们这篇文章介绍怎么使用EF连接MySql 作者的环境 VS2017.Win10.MySql5.x 前言 一般在EF中,默认是使用SqlServ ...

  5. ASP.NET Core使用EF Core操作MySql数据库

    ASP.NET Core操作MySql数据库, 这样整套环境都可以布署在Linux上 使用微软的 Microsoft.EntityFrameworkCore(2.1.4) 和MySql出的 MySql ...

  6. 在Asp.Net Core 5 中使用EF Core连接MariaDB

    升级到Asp.Net Core 5,使用EF Core连接MariaDB,使用的Nuget包Pomelo.EntityFrameworkCore.MySql也升级到了5.0.0-alpha.2,然后发 ...

  7. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  8. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  9. Abp.NHibernate连接PostgreSQl数据库

    Abp.NHibernate动态库连接PostgreSQl数据库 初次接触Abp框架,其框架中封装的操作各类数据的方法还是很好用的,本人还在进一步的学习当中,并将利用abp.NHibernate类库操 ...

  10. typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库

    接上一篇,这里使用 sequelize 来连接 postgresql 数据库 1.安装 sequelize,数据库驱动 pg yarn add sequelize sequelize-typescri ...

随机推荐

  1. @Transactional事务注解及请求接口的定义先后执行顺序设计

    @Transactional事务注解及请求接口的定义先后执行顺序设计1.事务内查询,可能存在事务没有提交,导致查询数据查不出来. 2.或者可能跟请求参数作为查询条件,在某个条件下,请求参数发生变化,也 ...

  2. rabbitMq消息没收到排查

    rabbitMq消息没收到排查 首先看是否本地机器开了服务,或者测试环境里面其他的个人电脑本地服务启动注册了,都监听了同一个队列,导致队列消息被接走了.现象是在测试环境期望的执行没有运行.或者关注服务 ...

  3. 基于 .NET CORE + VUE 前后端项目打包,实现批处理安装,一键部署

    2023年7月18日 目前基于已完成了基于WPF界面的全自动部署小工具 自动判断相关.net core环境和依赖,自动部署mysql数据库,自动部署前后端web服务的功能. 有疑问的可以直接评论. - ...

  4. Ansible的常用模块

    目录 ansible常用模块 1. file模块 1.1 file模块的选项 1.2 file模块的使用 1.2.1 使用file模块在远程主机创建文件 1.2.2 创建目录 1.2.3 删除文件/目 ...

  5. tar命令 --null -T 参数详解

    tar 命令的 --null 和 -T 参数可以一起使用,以从 null 设备读取文件名,并将这些文件名传递给 tar 命令来处理. --null 参数的作用是将文件名作为 null 字符分隔的字符串 ...

  6. 集成学习与随机森林(四)Boosting与Stacking

    Boosting Boosting(原先称为hypothesis boosting),指的是能够将多个弱学习器结合在一起的任何集成方法.对于大部分boosting方法来说,它们常规的做法是:按顺序训练 ...

  7. 在win10上安装MTK驱动(附驱动下载链接)

    参考:https://www.cnblogs.com/keepgoing707/p/4926171.html 背景 在调试MTK平台MT67XX的时候,发现安装preloader驱动装不上. 第三方i ...

  8. FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"3.4.3  把原始的H264文件封装为MP4格式"介绍了如何把H.264裸流封装为MP4文件.那么在网络上传输 ...

  9. C#中重写(override)及覆盖(new)的区别详解

    1. 重写和覆盖的定义 1.1 重写(override)的定义   在C#中,用override关键字来重写一个父类中的虚方法或抽象方法.override关键字用于指示编译器,我要用派生类中的一个方法 ...

  10. .NET 9 预览版6发布

    微软发布了 .NET 9 的第 6 个预览版,此版本包括对运行时.SDK..NET MAUI.ASP.NET Core 和 C# 的更新,预览版没有包含太多新的主要功能或特性,因为已接近 .NET 9 ...