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

标签 f# .net-core type-providers csqldataprovider

白天,我是一名 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 应用程序中,我认为(也许)有更大的空间来解决该问题。

有什么解决办法吗?我尝试过升级/降级各种 block 包,但无济于事

最佳答案

不久前,我的玩具 F# 项目也遇到了同样的问题。我没有找到任何合适的解决方案,最终完全忽略了交易。这并没有解决根本问题,但对我来说已经足够了(该项目主要用于学习目的)。

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

let dbContext = Sql.GetDataContext(TransactionOptions)

关于f# SqlDataProvider .Net Core 2.0 - 不支持在环境中登记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48609553/

相关文章:

f# - F# lambda vs Func 的重载解析

asynchronous - 使用 F# 和 Task<T> 的循环并发算法

F# - 根据输入数组的值和索引创建元组数组

angular - 在 .Net Core Angular 5 网站中缓存破坏 index.html

windows-8 - F# TypeProvider 可以在 Windows 应用商店应用程序中使用吗?

f# - 嵌入 F# 交互式示例从 FSharp.Compiler.Service 抛出异常

.net - 在 VS 2017 RC 中创建 .NET 标准类库时,我应该如何将包引用保留为私有(private)实现细节?

c# - 如何在 Visual Studio Code 中添加 App.Config?

f# - 类型提供者中奇怪的 None 行为

f# - SqlEntityConnection(实体数据模型)TypeProvider