我在ASP.Net API (.Net 6)项目中使用Dapper2.0.123、Npgsql 2.0.78和Npgsql 6.0.4。Postgres数据库中的表有列status定义为campaigns_status_enum。类及其枚举如下:
[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定义如下:
CREATE TYPE public.campaigns_status_enum AS ENUM
('active', 'inactive', 'draft');在这里和Npgsql 文档中的其他问题中,我读到我需要使用NpgsqlConnection.GlobalTypeMapper,根据这一点,在我的Startup.cs中,我设置了如下映射:
NpgsqlConnection.GlobalTypeMapper.MapEnum<Common.Campaigns.Campaign.ECampaignStatus>("campaigns_status_enum");在ConfigureServices内部,在注入处理连接等的DatabaseService之前,我还设置了
IDbConnection db = new NpgsqlConnection(ConnectionString);
if (db.State != ConnectionState.Open)
{
db.Open();
((NpgsqlConnection)db).ReloadTypes();
}在这个DatabaseService里面,但是很明显它没有效果。当我试图使用INSERT或UPDATE使用Dapper.Contrib函数UpdateAsync, InsertAsync时,会得到以下异常:
{"42804: column \"status\" is of type campaigns_status_enum but expression is of type integer\r\n\r\nPOSITION: 172"}我做错了什么,为什么这个.Net枚举没有映射到Postgres枚举?
发布于 2022-06-12 11:51:59
我觉得这不值得。我会保持简单
没有postgres枚举,任何附加的映射c#枚举都将映射为整数。您的实体具有enum属性,它映射到数据库中的简单数字。
https://stackoverflow.com/questions/72590759
复制相似问题