Ari*_*stu 5 postgresql f# type-providers .net-core 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>
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
错误FS3033:类型提供程序'FSharp.Data.Sql.SqlTypeProvider'报告了一个错误:由于以下原因,无法解析字段令牌0x04000523:无法加载字段'Npgsql.NpgsqlConnection + d__28:<> u__2'(7)到:无法加载文件或程序集'System.Threading.Tasks.Extensions,版本= 4.1.0.0,区域性=中性,PublicKeyToken = cc7b13ffcd2ddd51'或其依赖项之一。程序集:System.Threading.Tasks.Extensions,版本= 4.1.0.0,文化=中性,PublicKeyToken = cc7b13ffcd2ddd51类型:成员:(null)签名:程序集:(my_filesystem)/API/packages/Npgsql/lib/netstandard2.0/ Npgsql.dll类型:d__28成员:(空)签名:
这很奇怪,因为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
Run Code Online (Sandbox Code Playgroud)
此外,该项目是通过.Net Core 2.1.200生成的,并且在Linux上运行。
这是因为类型提供程序需要解析第三方驱动程序的依赖关系(Npgsql在这种情况下),而不能,因为它无法像NuGet(或Paket)那样访问完整的依赖关系树。您需要复制System.Threading.Tasks.Extensions.dll到所在的文件夹Npgsql.dll(您的ResPath),以便类型提供程序可以解析该程序集。
完成此操作后,您将发现还需要复制System.Runtime.CompilerServices.Unsafe。