我有一个 Postgres 12 数据库,当前仅包含一个简单的表:
CREATE TABLE public.messages
(
sender text COLLATE pg_catalog."default",
"timestamp" timestamp with time zone,
message_id bigint,
text text COLLATE pg_catalog."default",
priority bigint,
parameters text[] COLLATE pg_catalog."default"
)
不,我想使用 Npgsql 用 C# 和实体框架构建 GUI。我安装了 Nuget 包:
Install-Package EntityFramework6.Npgsql
成功了:
Successfully installed 'EntityFramework6.Npgsql 6.4.0' to TestClient
接下来,我安装了 VS 2019 的 Npgsql 集成(在此处找到)。当我尝试通过在解决方案资源管理器中右键单击 ADO.NET 实体数据模型将其添加到我的项目时,我可以添加连接并且连接测试成功(在向导中完成)。我可以继续选择我的桌子,但一旦按“完成”,我就会收到错误消息:
这是控制台输出:
由于以下异常,无法生成模型: 'System.Data.Entity.Core.EntityCommandExecutionException:错误 执行命令定义时发生。看内在 详细信息例外。 ---> Npgsql.PostgresException:42703:列 c.consrc 不存在
我能做什么?
PG12 删除了 pg_constraint.consrc,这是由 PG12 删除了 pg_constraint.consrc 跟踪的。在发布修复程序之前,应该可以降级到 PG11。
对于 postgres 12+(我当前使用版本 16),可以使用以下查询列出某个表的约束及其详细信息。
SELECT
conname AS constraint_name,
contype AS constraint_type,
conkey AS constrained_columns,
confkey AS referenced_columns,
confrelid::regclass AS referenced_table,
conrelid::regclass AS constrained_table,
CASE
WHEN contype = 'f' THEN 'FOREIGN KEY'
WHEN contype = 'u' THEN 'UNIQUE'
WHEN contype = 'p' THEN 'PRIMARY KEY'
WHEN contype = 'c' THEN 'CHECK'
END AS constraint_category,
CASE
WHEN contype = 'c' THEN
(SELECT pg_get_constraintdef(oid) FROM pg_constraint WHERE oid = c.oid)
END AS check_expression
FROM
pg_constraint c
WHERE
conrelid = 'table_name'::regclass;