如何在 .net 核心上使用 ef 核心在 postgresql(db first)中映射枚举

Posted

技术标签:

【中文标题】如何在 .net 核心上使用 ef 核心在 postgresql(db first)中映射枚举【英文标题】:How to mapping enum in postgresql (db first) with ef core on .net core 【发布时间】:2021-05-15 17:34:59 【问题描述】:

我正在编写一个记录我得到的异常的中间件。

我在postgresql上创建了枚举值

并将其映射到我的日志表

我的日志模型是:

   public class Log

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [JsonIgnore]
    public int Id  get; set; 
    public EventType EventType  get; set; 
    public string Description  get; set; 
    public DateTime CreatedAt  get; set; 


我的错误中间件是:

        var log = new Log();
        log.Description = ex.Message;
        log.EventType = EventType.Exception;
        log.CreatedAt = DateTime.Now;

        Context.Add(log);
        Context.SaveChanges();

(这将在界面上出现,但我想尽快展示)

我的背景:

 protected override void OnModelCreating(ModelBuilder model)
    
        model
            .HasPostgresEnum(null, "event_type", new[]  "info", "unknown", "warning", "exception" );


  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        optionsBuilder
            .UseNpgsql(Configuration.GetConnectionString("MyConnection"))
            .UseCamelCaseNamingConvention();
        NpgsqlConnection.GlobalTypeMapper.MapEnum<EventType>("enum_logs_eventType");
    

我认为我做的一切都是正确的。它是 DB First,所以我迁移了数据库,但我认为您在那里执行了相同的步骤。

当我运行服务并触发任何错误时,我会收到此错误:

When I try to cast to string or run .HasConversion or something i get this error:
 

【问题讨论】:

EventType.Exception 值显然是“异常”,而 Posthresql enum_logs_eventType 包含“异常”。 Posthresql enum 值区分大小写。因此枚举“enum_logs_eventType”的输入值无效:“异常” 这个信息解决了我的问题。我删除并重新创建了枚举值。你能把这个写成答案吗?如果有人遇到此错误,他们可能看不到此评论。 【参考方案1】:

Posthresql 枚举值区分大小写。所以当我删除枚举并再次修复它们时(它们都是小写的),错误就解决了。

【讨论】:

以上是关于如何在 .net 核心上使用 ef 核心在 postgresql(db first)中映射枚举的主要内容,如果未能解决你的问题,请参考以下文章

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

如何根据 HTTP 响应中的条件返回不同的对象类型(.net 核心)

使用 EF 核心 3 将字符串与日期进行比较

如何从分页的 ef 核心查询中获取可用的总行数

使用 EF 框架的 .NET 核心 MVC - 将数据从一个控制器传递到另一个控制器

如何使用 EF 核心在 SQLite 中创建自动增量列?