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
相关产品推荐
相关产品推荐

