You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework Core PostgreSQL枚举类型不存在,如何添加Schema前缀?

PostgreSQL EF Core Code First枚举类型自动添加Schema前缀的解决方法

问题说明

在PostgreSQL的Main schema下定义了名为document_validity的枚举类型,通过EF Core Code First模式映射到C#的DocumentValidity枚举。执行查询时,EF Core生成的SQL未给枚举类型添加Schema前缀,导致抛出类型不存在的异常;手动在枚举类型前加上"Main".前缀后,查询可正常执行。

EF生成的错误SQL片段

...
SELECT CASE
WHEN d3."Validity" IN ('not_checked'::document_validity, 'rejected'::document_validity) THEN 4
ELSE 1
...

抛出的异常信息

Npgsql.PostgresException (0x80004005): 42704: type "document_validity" does not exist

手动修正后的正确SQL片段

SELECT CASE
WHEN d3."Validity" IN ('not_checked'::"Main".document_validity, 'rejected'::"Main".document_validity) THEN 4
ELSE 1

当前模型代码

public enum DocumentValidity
{
    NotChecked = 0,
    Validated = 1,
    Rejected = 2,
}

public class Document
{
    ...
    public DocumentValidity Validity { get; set; }
    ...
}

public class MyDbContext : DbContext
{
    ...
    static MyDbContext()
        => NpgsqlConnection.GlobalTypeMapper.MapEnum<DocumentValidity>();

    protected override void OnModelCreating(ModelBuilder builder)
        => builder.HasPostgresEnum<DocumentValidity>();
    ...
}

解决方案

在OnModelCreating方法中配置枚举时,显式指定对应的数据库Schema即可让EF Core自动为枚举类型添加Schema前缀。

修改后的DbContext配置

public class MyDbContext : DbContext
{
    ...
    static MyDbContext()
        => NpgsqlConnection.GlobalTypeMapper.MapEnum<DocumentValidity>();

    protected override void OnModelCreating(ModelBuilder builder)
    {
        // 指定枚举所属的Schema,若枚举名称与数据库默认映射一致,name参数可省略
        builder.HasPostgresEnum<DocumentValidity>(schema: "Main");
    }
    ...
}

如果数据库中的枚举名称与C#枚举的默认映射名称不一致(比如自定义了名称),可以同时指定name参数:

builder.HasPostgresEnum<DocumentValidity>(schema: "Main", name: "document_validity");

配置完成后,EF Core生成的查询SQL会自动为枚举类型加上"Main".前缀,无需手动修改即可正常执行。

内容的提问来源于stack exchange,提问作者Abdelhakim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:10:21