F#如何连接Postgres数据库使用SQLProvider

4

我是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,Version=4.1.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项。程序集:System.Threading.Tasks.Extensions,Version=4.1.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51 类型:member:(null) signature: assembly:(my_filesystem)/API/packages/Npgsql/lib/netstandard2.0/Npgsql.dll type:d__28 member:(null) signature:
尽管实际上已导入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 上运行。

1个回答

6
这是因为类型提供程序需要解决第三方驱动程序(在本例中为Npgsql)的依赖关系,但它无法像NuGet(或Paket)那样访问完整的依赖树。 你需要将System.Threading.Tasks.Extensions.dll复制到与Npgsql.dll相同的文件夹中(即你的ResPath),以便类型提供程序可以解决该程序集。
一旦你这样做了,你会发现你还需要复制System.Runtime.CompilerServices.Unsafe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接