postgresql - Npgsql.PostgresException (0x80004005) : XX000: cache lookup failed for type 207852 when schema dropped

标签 postgresql f# npgsql postgresql-9.6

我',运行我的测试套件并尝试使用枚举:

CREATE TYPE dockind AS ENUM ('I', 'O', 'Q');
CREATE TABLE document (
    doc_id       SERIAL,
    doc_kind     dockind NOT NULL DEFAULT 'O',
)

let openConn() =
    let conStr = localConnectionString()
    let conn = new NpgsqlConnection(conStr)
    conn.Open()


    conn :> IDbConnection
//Called after the schema is created
let initDb (conn:IDbConnection) =
    let db = conn :?> NpgsqlConnection
    db.TypeMapper.MapEnum<DocKind>("dockind") |> ignore

但是,我遇到了一个奇怪的错误:

Npgsql.PostgresException (0x80004005): XX000: cache lookup failed for type 207852
   at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext() in C:\projects\npgsql\src\Npgsql\NpgsqlConnector.cs:line 1032
--- End of stack trace from previous location where exception was thrown ---
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming) in C:\projects\npgsql\src\Npgsql\NpgsqlDataReader.cs:line 444
   at Npgsql.NpgsqlDataReader.NextResult() in C:\projects\npgsql\src\Npgsql\NpgsqlDataReader.cs:line 332
   at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken) in C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs:line 1221
   at Npgsql.NpgsqlCommand.ExecuteScalar(Boolean async, CancellationToken cancellationToken) in C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs:line 1086
   at Npgsql.NpgsqlCommand.ExecuteScalar() in C:\projects\npgsql\src\Npgsql\NpgsqlCommand.cs:line 1063
   at CoreLib.Db.queryScalar[a,b](a con, String sql, IEnumerable`1 parameters) in /Users/mamcx/Proyectos/BestSellerPOS/CoreLib/DbStore.fs:line 184

Npgsql 版本 4.0.0


这发生在我删除架构并重建它时。如果我不重建它,它就可以工作。那么如何解决这个问题呢?

let createDb() =
    use con = openConn()
    let sql = openDbFile()
    exeSql con sql |> ignore

let testDb() =
    DbServer.createDb()
    let db = DbServer.openConn()
    DbServer.initDb(db)

我没有使用重用连接来构建数据库和执行测试。

最佳答案

Npgsql 在第一次连接给定数据库时缓存所有 PostgreSQL 类型(类型缓存在连接字符串上)。如果您对类型进行任何更改,例如定义新类型或删除类型,则必须通过调用 NpgsqlConnection.ReloadTypes() 告诉 Npgsql 刷新类型缓存。

关于postgresql - Npgsql.PostgresException (0x80004005) : XX000: cache lookup failed for type 207852 when schema dropped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51086421/

相关文章:

f# - 如何编写一个计算表达式构建器来累积一个值并允许标准语言构造?

.net - 为什么 F# 中存在大写命名模式?

c# - 生成 .ADO.net 实体数据模型时,postgresql 未出现在数据源中

sql - 如何从 PostgreSQL 9.4 中的匿名行类型中获取第一个字段?

haskell - 是否可以将 F# 记录的标签用作 Haskell 中的函数或类似的函数?

c# - 在 Dapper 中使用 Protocol Buffer 模型时如何将 C# ticks 映射到 PostgreSQL 时间戳?

c# - 来自 C# 的 PostgreSQL 参数化查询中的解析错误,但在 pgAdmin III 中有效

带有 IN 的 Postgresql ALL

java - Postgresql,使用 JDBC 插入后获取生成的序列

sql - PostgreSQL - 基于列数据的减法简化查询