问题:F# 使用 Postgres 连接 SQLProvider

我是 F# 和 .Net 世界的初学者,我正在尝试使这个 F# 脚本工作:

#r "./packages/SQLProvider/lib/netstandard2.0/FSharp.Data.SqlProvider.dll"
#r "./packages/SQLProvider/lib/netstandard2.0/netstandard.dll"
#r "./packages/Npgsql/lib/netstandard2.0/Npgsql.dll"

open FSharp.Data.Sql
open Npgsql

let [<Literal>] ConnString = 
    "Host=localhost;"       +
    "Port=5431;"            +
    "Database=suavetododb;" +
    "Username=postgres;"    +
    "Password=postgres"

let [<Literal>] DbVendor = Common.DatabaseProviderTypes.POSTGRESQL
let [<Literal>] ResPath = @"./packages/Npgsql/lib/netstandard2.0"

type Sql =
    SqlDataProvider<
        DbVendor,
        ConnString,
        "",
        ResPath,
        1000,
        true>

这是我得到的错误:

错误 FS3033:类型提供程序 'FSharp.Data.Sql.SqlTypeProvider' 报告错误:无法解析字段令牌 0x04000523,原因是:无法加载字段类型 'Npgsql.NpgsqlConnection+d__28:<>u __2' (7) 由于:无法加载文件或程序集 'System.Threading.Tasks.Extensions, Versionu003d4.1.0.0, Cultureu003dneutral, PublicKeyTokenu003dcc7b13ffcd2ddd51' 或其依赖项之一。程序集:System.Threading.Tasks.Extensions,版本u003d4.1.0.0,文化u003d中性,PublicKeyTokenu003dcc7b13ffcd2ddd51 类型:成员:(空)签名:程序集:(my_filesystem)/API/packages/Npgsql/lib/netstandard2。 0/Npgsql.dll 类型:d__28 成员:(null) 签名:

这很奇怪,因为Npgsql实际上是导入的(所以最后一个#r确实有效)。

数据库通过 docker 启动:

$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
4704763ec2ba        suave_rezoom_db:0.1   "docker-entrypoint.s…"   25 hours ago        Up 2 hours          0.0.0.0:5431->5432/tcp   todo_rezoom_1

此外,该项目是通过 .Net Core 2.1.200 生成的,并且在 Linux 上运行。

解答

这是因为类型提供程序需要解析第三方驱动程序(在本例中为Npgsql)的依赖关系,但它不能像 NuGet(或 Paket)那样访问完整的依赖关系树。您需要将System.Threading.Tasks.Extensions.dll复制到Npgsql.dll所在的同一文件夹(您的ResPath),以便类型提供程序可以解析该程序集。

一旦你这样做了,你会发现你还需要复制System.Runtime.CompilerServices.Unsafe

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐