首页 > 解决方案 > 具有 PostgreSQL 和 SEQUENCE 功能的实体框架核心

问题描述

我已经习惯了 SQL Server 世界,如果我想创建一个供许多会话使用的“下一个数字”表,我可能会在单行表中使用某种 INT IDENTITY(1,1) AUTO INCREMENT 列,并且只需严格控制事务访问,以确保每个要求提供 ID 的人都能获得唯一的下一个可用 ID。

但是,我目前正在使用 Entity Framework Core 和 PostgreSQL,并且遇到了 SEQUENCE 和 nextval 功能。这听起来很适合这个要求,但我不清楚或不确定如果我尝试将此表引入 EF Core 会发生什么。我使用数据库优先方法,并在开始时从现有表中生成所有模型。如果我需要添加一个新列,我只需将其手动添加到我的 EF 代码中,如果我需要做一些更基本的事情,比如新表,我将重新运行 db scaffold EF Core CLI 命令,将特定表引用为范围。

因为这个 'SEQUENCE' 表 - 对于像我这样的 SQL 服务器人来说 - 似乎是特殊的 PostgreSQL 巫术,如果我尝试从数据库中构建它,任何人都可以解释这个表会是什么样子吗?它会显示为普通的表模型/实体吗?是否需要任何特别的东西,因为我希望能够从该表中选择以获得下一个可用的数字(有时来自许多连续快速的会话)?

标签: c#postgresqlentity-frameworksequence

解决方案


Postgres 序列类似于 Oracle 的序列。oracle 文档总结如下:

https://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm#ADMIN11793

序列是多个用户可以从中生成唯一整数的数据库对象。序列生成器生成序列号,这有助于自动生成唯一的主键,并协调跨多行或多表的键。

如果没有序列,则只能以编程方式生成顺序值。可以通过选择最近产生的值并增加它来获得一个新的主键值。这种方法在事务过程中需要一个锁,导致多个用户等待主键的下一个值;这种等待称为序列化。如果开发人员在应用程序中有这样的结构,那么您应该鼓励开发人员用对序列的访问来替换它们。序列消除了序列化并提高了应用程序的并发性。


推荐阅读