首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Npgsql enum映射

Npgsql enum映射
EN

Stack Overflow用户
提问于 2022-06-12 08:56:56
回答 1查看 270关注 0票数 0

我在ASP.Net API (.Net 6)项目中使用Dapper2.0.123、Npgsql 2.0.78和Npgsql 6.0.4。Postgres数据库中的表有列status定义为campaigns_status_enum。类及其枚举如下:

代码语言:javascript
复制
[Table("campaigns")]
public class Campaign
{
    [Key]
    public int id { get; set; }
    // ommited, irrelevant to this question

    //[NpgsqlTypes.PgName("campaigns_status_enum")]
    public ECampaignStatus status { get; set; }

    public enum ECampaignStatus
    {
        [NpgsqlTypes.PgName("active")]
        active,
        [NpgsqlTypes.PgName("inactive")]
        inactive,
        [NpgsqlTypes.PgName("draft")]
        draft
    }
}

数据库中的Enum定义如下:

代码语言:javascript
复制
CREATE TYPE public.campaigns_status_enum AS ENUM
('active', 'inactive', 'draft');

在这里和Npgsql 文档中的其他问题中,我读到我需要使用NpgsqlConnection.GlobalTypeMapper,根据这一点,在我的Startup.cs中,我设置了如下映射:

代码语言:javascript
复制
NpgsqlConnection.GlobalTypeMapper.MapEnum<Common.Campaigns.Campaign.ECampaignStatus>("campaigns_status_enum");

ConfigureServices内部,在注入处理连接等的DatabaseService之前,我还设置了

代码语言:javascript
复制
IDbConnection db = new NpgsqlConnection(ConnectionString);
if (db.State != ConnectionState.Open)
{
        db.Open();
        ((NpgsqlConnection)db).ReloadTypes();
}

在这个DatabaseService里面,但是很明显它没有效果。当我试图使用INSERTUPDATE使用Dapper.Contrib函数UpdateAsync, InsertAsync时,会得到以下异常:

代码语言:javascript
复制
{"42804: column \"status\" is of type campaigns_status_enum but expression is of type integer\r\n\r\nPOSITION: 172"}

我做错了什么,为什么这个.Net枚举没有映射到Postgres枚举?

EN

回答 1

Stack Overflow用户

发布于 2022-06-12 11:51:59

我觉得这不值得。我会保持简单

没有postgres枚举,任何附加的映射c#枚举都将映射为整数。您的实体具有enum属性,它映射到数据库中的简单数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72590759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档