F # Соединить SQLProvider с Postgres - PullRequest
0 голосов
/ 05 июня 2018

Я новичок как в 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, версия = 4.1.0.0, культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51' или одна из ее зависимостей.сборка: System.Threading.Tasks.Extensions, версия = 4.1.0.0, культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51 тип: член: (ноль) подпись: сборка: (my_filesystem) /API/packages/Npgsql/lib/netstandard2.0/Npgsql.dll тип: d__28 член: (ноль) подпись:

Что странно, поскольку Npgsql фактически импортировано (поэтому последний #r фактически работает).

База данных работает через докер:

$ 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 голосов
/ 19 июля 2018

Это связано с тем, что провайдеру типов необходимо разрешить зависимости стороннего драйвера (в данном случае Npgsql), а это невозможно, потому что у него нет доступа к полному дереву зависимостей, например NuGet (или Paket).) делает.Вам нужно скопировать System.Threading.Tasks.Extensions.dll в ту же папку, где находится Npgsql.dll (ваш ResPath), чтобы поставщик типов мог разрешить эту сборку.

Как только вы это сделаете, вы обнаружите, что вы такженужно скопировать System.Runtime.CompilerServices.Unsafe.

...