f# SqlDataProvider .Net Core 2.0 - 环境中的登记不受支持。

3

我白天是一名C#程序员,但同时也是F#的爱好者。

在做一些教程(suave)时,我遇到了这个错误:

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应用程序中,我认为在那里有更多的工作空间可以解决问题(也许)。有什么想法可以解决它吗?我尝试升级/降级各种NuGet软件包,但都没有成功。

1
只是为了明确,原教程使用的是Postgres,但我决定使用我的SQL Express数据库。尽管我会尝试使用Postgres,但如果MS技术在Postgres中可行而在SQL Express中不可行,那似乎很奇怪。 - MrD at KookerellaLtd
1
尝试做Postgres的事情...结果遇到了不同的痛苦世界,有未解决的引用问题,似乎是一个持续存在的问题。 - MrD at KookerellaLtd
1
我得出结论,这里一切并不顺利......如果我没有解决编译依赖关系(回到dll地狱?)我就要解决运行时依赖关系(回到dll地狱?)......感觉像20年前的C开发...... - MrD at KookerellaLtd
你尝试过Dapper或EF Core吗? - s952163
2个回答

1
我最近在我的玩具F#项目中遇到了同样的问题。我没有找到任何合适的解决方案,最终放弃了事务处理。这并不能解决根本问题,但对于我来说已经足够了(该项目主要用于学习目的)。
let TransactionOptions = {IsolationLevel = IsolationLevel.DontCreateTransaction; Timeout = TimeSpan.FromSeconds(1.0)}

let dbContext = Sql.GetDataContext(TransactionOptions)

0

我不确定上面的方法是否有效,但它似乎是一个合理的解决方法。 我已经解决了我的问题,但是通过回退到基于框架的控制台应用程序模板而不是核心模板。


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