F# SqlDataProvider .Net Core 2.0 - зачисление в ambient не поддерживается

Днем я программист на C#, но энтузиаст F#.

Вист делает некоторые уроки (учтивый) Я наткнулся на эту ошибку

System.NotSupportedException
  HResult=0x80131515
  Message=Enlisting in Ambient transactions is not supported.
  Source=System.Data.SqlClient
  StackTrace:
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at FSharp.Data.Sql.Providers.MSSqlServerProvider.FSharp-Data-Sql-Common-ISqlProvider-ProcessUpdates(IDbConnection con, ConcurrentDictionary`2 entities, TransactionOptions transactionOptions, FSharpOption`1 timeout)
   at <StartupCode$FSharp-Data-SqlProvider>.$SqlRuntime.DataContext.f@1-52(SqlDataContext __, IDbConnection con, Unit unitVar0)
   at FSharp.Data.Sql.Runtime.SqlDataContext.FSharp-Data-Sql-Common-ISqlDataContext-SubmitPendingChanges()
   at Program.main(String[] argv) in C:\Users\M_R_N\source\repos\ConsoleApp2\ConsoleApp2\Program.fs:line 34

тем не менее, код кажется таким тривиальным, я не могу поверить, что он не работает, мы, кажется, можем читать данные из (SQL Express) базы данных, но не записывать в нее (или, по крайней мере, не удалять, я не пытался добавить). Я на самом деле не знаю, что такое внешняя транзакция, меня не интересует поведение транзакции. Я просто хочу выбрать некоторые данные, обновить их или удалить их.

Это весь код....

open System
open FSharp.Data.Sql

[<Literal>]
let ConnectionString = 
    "Data Source=(localdb)\ProjectsV13;Initial Catalog=suavemusicstore;Integrated Security=SSPI;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

type Sql =
    SqlDataProvider<
        ConnectionString = ConnectionString,
        DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER>

type DbContext = Sql.dataContext
type Album = DbContext.``dbo.AlbumsEntity``
type Genre = DbContext.``dbo.GenresEntity``

let getAlbum id (ctx : DbContext) : Album option =
    query {
        for album in ctx.Dbo.Albums do
        where (album.AlbumId = id)
        select album
    } |> Seq.tryHead

[<EntryPoint>]
let main argv =
    let ctx = Sql.GetDataContext()

    match (getAlbum 2 ctx) with
    | Some(album) -> 
        album.Delete()
        ctx.SubmitUpdates() // EXCEPTION thrown here
        0
    | _ -> 0

есть ли обходной путь? Впервые я использовал провайдеров типов и ядро, но кажется, что вы не можете написать простое приложение CRUD.

об этом уже сообщалось в других местах, в основном в приложениях C# EF, где, я думаю, есть больше возможностей для решения проблемы (возможно).

Есть идеи как обойти это? Я пытался обновить / понизить различные пакеты самородков, но безрезультатно

2 ответа

Решение

У меня была такая же проблема не так давно на моем игрушечном проекте F#. Я не нашел правильного решения и в итоге полностью игнорировал транзакции. Это не решает основную проблему, но для меня этого было достаточно (проект в основном для учебных целей).

let TransactionOptions = {IsolationLevel = IsolationLevel.DontCreateTransaction; Timeout = TimeSpan.FromSeconds(1.0)}

let dbContext = Sql.GetDataContext(TransactionOptions)

Я не знаю, работает ли вышеуказанное, но это кажется разумным решением. Я ДЕЙСТВИТЕЛЬНО исправил свою проблему, но вернувшись к основному шаблону консольного приложения, а не к основному.

Другие вопросы по тегам