gpt4 book ai didi

c# - Npgsql 3.0.0 解析枚举类型失败

转载 作者:行者123 更新时间:2023-11-29 11:49:57 25 4
gpt4 key购买 nike

我在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; }
}

当我去反序列化我的类时,我得到了错误

Error parsing column 0 (Field1=The field Field1 has a type currently unknown to Npgsql (OID 6965926). You can retrieve it as a string by marking it as unknown, please see the FAQ.)

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

1) Change the query to explicitly cast unknown types to built-in types
2) Change all Npgsql queries to forgo the use of binary encoding

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

SELECT * FROM Foo

收件人:

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

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

最佳答案

解决方案是在创建任何连接之前注册每个枚举。在我的例子中,这一行被添加到我的数据访问层类的静态构造函数中:

NpgsqlConnection.RegisterEnumGlobally<SomeEnumType>(
typeof(SomeEnumType).Name);

如果您在 Postgres 中使用不区分大小写的命名(例如,没有引用 Postgres 数据类型),那么您不需要将任何参数传递给 RegisterEnumGlobally,因为默认值是 C# 类型的小写名称。

关于c# - Npgsql 3.0.0 解析枚举类型失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31998362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com