EF Core连接PostgreSQL数据库

news/2024/11/19 20:26:18/文章来源:https://www.cnblogs.com/mingupupu/p/18347247

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.hqwc.cn/news/779292.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js文字无限循环向上滚动轮播

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet"><title>滚动…

使用W外链平台免费创建活码+客服码

在当今数字化时代,无论是企业营销、个人品牌建设还是日常交流互动,线上工具的灵活运用都显得尤为重要。其中,外链平台作为连接不同网络空间的桥梁,其重要性不言而喻。今天,我们将深入探讨如何利用W外链平台这一强大工具,免费创建活码与客服码,以优化用户体验,提升运营效…

Django请求和响应

1. 请求获取请求方式 GET/POSTprint(requset.method) 通过url传递值 /something?n1=1234&n2=456print(requset.GET) 通过请求体获取数据print(requset.POST)【注】:获取的请求方式和传递的值和数据,可在终端后台看见2. 响应HttpResponse("返回内容") 将字符串…

B站基于Apache DolphinScheduler的一站式大数据集群管理平台(BMR)初窥

一、背景 大数据服务是数据平台建设的基座,随着B站业务的快速发展,其大数据的规模和复杂度也突飞猛进,技术的追求也同样不会有止境。 B站一站式大数据集群管理平台(BMR),在千呼万唤中孕育而生。本文简单介绍BMR的由来、面临的主要矛盾以及如何在变化中求得生存与发展。 下…

烧烤 题解

题目id:11063 题目描述 \(Snuke\)有一个烧烤聚会。 聚会上,他将制作\(N\)份串烧。$\ \ \ \ \ \ \ $一份串烧 他有\(2N\)根烤肉钎子,它们都将用于制作串烧。第i个烤肉钎子的长度为Li。此外,他有无限供应的原料。他将原料串在两根烤肉钎子上做成一份串烧。一份串烧可串起的原…

信创系统问题解决笔记

本文介绍了搭建信创环境,解决显示问题的全过程。本文记述解决信创系统显示问题过程经历,描述遇到的各种问题以及解决方法。 问题描述 测试反馈,在信创系统上,部分界面字体显示异常,表现为内容越界、文字区域显示为小空格,如下图所示:初步分析是字体原因,具体情况需要更…

文件包含的skill

关于文件包含 🚩php7 segment fault特性原理:php代码中使用php://filter的strip_tags过滤器,可以让php执行的时候直接出现Segment Fault,这样php的垃圾回收机制就不会继续执行,导致POST的文件会保存在系统的缓存目录下不会被删除,不像phpinfo上传的文件很快就会被删除,…

fiddler - 对模拟器app抓包配置

1.fiddler部分 tools》options 中, 这几个配置勾选跟我的一致,端口使用8888然后导出证书 会导出到桌面 然后pc授信证书 然后重启fiddler2.模拟器部分 将证书拉入模拟器,然后点击证书安装,输入的名称可以随便写 然后打开wlan,对wifi的修改代理为手动 【模拟器有些是长按,…

OSGI

OSGI 基础概述 概述:OSGI是Open Services Gateway initiative的缩写,叫做开放服务网关协议,通常可能指OSGi联盟、OSGi标准或者OSGi框架。 OSGI:OSGI联盟现在将OSGI定义为一种技术,该技术是指一系列用于定义Java动态化组件系统的标准。这些标准通过为大型分布式系统以及嵌入…

5-7折优惠电影票API接口,微客云提供电影票api

正规对接途径和考虑因素 API供应商:一些大型的在线票务平台 :如猫眼、淘票票等,如果能与他们达成合作,可能获得稳定且正规的接口,但通常门槛较高(主要面向一些大型的、正规的、有一定规模和背景的商业伙伴,且有严格的审核流程和商务合作流程等)。 影院院线自己 :如果是…

直接内存作用

1.直接内存不由JVM内存管理,是来源于java NIO向操作系统申请而来的。 当把磁盘文件复制到内存中 JVM通过NIO直接访问数据。(起到了优化系统性能,避免了复制到java堆空间) 每天坚持,终会抵达!

不能在此路径中使用此配置节,如果在父级别上锁定了该节,便会出现这种情况的解决办法

原文链接:https://www.pageadmin.net/help/96.cshtml 问题描述:打开网站一直提示“不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")” 具体如下图:问题分析:出现这个错误是因为 IIS 7 采…