Npgsql 3.0.0无法解析枚举类型

时间:2015-08-13 21:02:12

标签: c# postgresql dapper npgsql

我在Postgres中列举了类型,定义如下:

CREATE TYPE "SomeEnumType" AS ENUM (
    'Val1',
    'Val2'
);

我在C#中定义了等效的枚举:

public enum SomeEnumType {
    Val1,
    Val2
}

当我更新到Npgsql v3.0.0时,反序列化具有此类属性的类失败。例如,我有:

CREATE TABLE Foo (
    Field1 "SomeEnumType" NOT NULL
);

在代码中:

public class Foo {
    public SomeEnumType Field1 { get; set; }
}

当我去反序列化我的课程时,我收到了错误

  

解析第0列时出错(Field1 =字段Field1具有Npgsql当前未知的类型(OID 6965926)。您可以通过将其标记为未知来将其检索为字符串,请参阅常见问题解答。)

我尝试向Dapper添加一个类型处理程序,但这并没有解决异常。我发现a related question and answer指向FAQ page on the Npgsql site。但是,该页面上的唯一答案似乎是:

  

1)更改查询以将未知类型显式转换为内置类型
  2)更改所有Npgsql查询以放弃使用二进制编码

第一个解决方案使我的查询变得非常复杂,因为真正的表有很多列。例如,使用此解决方案会更改我的所有查询:

SELECT * FROM Foo

要:

SELECT Column1, Column2, Column3, Field1::TEXT, Column4 FROM Foo

这显然是一种不可接受的解决方案,因为任何数量的更改(重新排序列,添加列,删除列,更改列类型等)都可能需要更改查询。第二种解决方案更易于维护,但需要向服务器发送更多数据或从服务器发送更多数据,这将导致性能影响。有没有其他(读作:更易于维护)的方式让Npgsql v3.0.0解析枚举类型?

1 个答案:

答案 0 :(得分:0)

此回复适用于任何遇到此问题且上述解决方案无效的人。

我有类似的问题。事实证明,对于NpgsqlConnections,如果要在迁移中创建枚举,则必须重新加载类型。我使用DpUp作为迁移工具,并在迁移器的末尾添加了connection.ReloadTypes()Door上的更多内容只是我略读而已,因此最终导致数小时的沮丧。