F# Sql类型提供程序:如何访问

3

我正在使用TypeProvider来访问一些数据,类似这样:

type internal SqlConnection = 
    SqlEntityConnection<ConnectionString = 
        @"XXXXXXXXXX">

type FooRepository () =

    member x.GetFoo (Id) =
        let context = SqlConnection.GetDataContext()
        query {for foo in context.Foos do
                where (foo.Id = Id)
                select foo}

问题是我得到了以下内容:
“FooRepository”类型比它所使用的值、成员或类型“System.Linq.IQueryable”的可访问性更低。
我在这里看到了同样的问题:https://stackoverflow.com/questions/18811609/type-x-is-less-accessible-than-the-value
既然我想要公开此类型并且我不喜欢 SO 上的解决方案,我尝试做了以下事情:
SqlDataConnection<ConnectionString = 
    @"XXXXXXX">

问题在于数据库位于Azure Sql Server上,因此我遇到了这个错误:

类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告了一个错误:读取模式时出错。警告:SQM1012:无法从SqlServer提取'tbo.Foos'表。

有人知道如何解决吗?使用TPs最好的一点是我不需要明确地定义类型 - 但看起来我必须这样做? 烦死了。
1个回答

3
你确定你遇到的错误就是你在这里发布的吗?我的印象是较不易访问的类型应该来自生成的数据库模式(因为你将其标记为internal)。
我尝试通过编写一个使用Northwind数据库的简单库来重现你的错误:
open Microsoft.FSharp.Data.TypeProviders

type internal Nwind = SqlDataConnection<"Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True">
type NwindLibrary() = 
    let nw = Nwind.GetDataContext()
    member this.Products = nw.Products

我得到了以下消息:

类型“Products”的访问级别比它所使用的值、成员或类型“member Class1.Products : System.Data.Linq.Table”较低 C:\temp\Library1\Library1\Library1.fs 9 17 Library1

这正是我预期的 - 因为由提供程序生成的Nwind类型被标记为internal。但是,NwindLibrary类型是公共的,并且我定义的Products属性返回一个IQueryable<Table<Nwind.ServiceTypes.Product>>类型的值。编译器错误在此处并不特别有用(因为它说该类型只返回Table),但问题在于Nwind.ServiceTypes.Product是内部的,因此您不能在公共类型的公共属性中返回它。

如果将Nwind类型设置为public,则应该可以正常工作。如果您不想使生成的类型公开,则必须在自定义类型中包装返回的值。例如,即使将类型保留为内部类型,以下代码也可以正常工作(返回一个元组而不是生成的类型):

member this.Products = 
  query { for p in mys.Products do
          select (p.ProductID, p.ProductName) }

1
你尝试过使用SqlDataConnection连接Azure吗?我认为它不能用于连接Azure Sql Server存储... - Jamie Dixon

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