微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – Npgsql.PostgresException(0x80004005):XX000:模式丢弃时类型207852的缓存查找失败

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

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刷新类型缓存.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐