F#将SQLProvider与Postgres连接

时间:2018-06-05 16:36:28

标签: postgresql f# .net-core type-providers f#-4.0

我是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:类型提供程序&#39; FSharp.Data.Sql.SqlTypeProvider&#39;报告错误:无法解析字段标记0x04000523,原因是:无法加载字段类型&#39; Npgsql.NpgsqlConnection + d__28:&lt;&gt; u__2&#39; (7)由于:无法加载文件或程序集System.Threading.Tasks.Extensions,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51&#39;或其中一个依赖项。 assembly:System.Threading.Tasks.Extensions,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51 type:member:(null)signature:assembly:(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上运行。

1 个答案:

答案 0 :(得分:4)

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

执行此操作后,您会发现还需要复制System.Runtime.CompilerServices.Unsafe