为什么SqlDataProvider在Mac OS X下不能在Mono 3.2中运行?

时间:2013-11-23 18:24:34

标签: sql-server f# type-providers

当我使用SqlDataProvider<ConnectionString = "...">类型提供程序时,它会在Visual Studio和Windows下的Xamarin Studio中进行类型检查。但是,在Mac OS X下的Xamarin Studio中,它失败并出现以下错误:

  

错误FS3033:类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告错误:读取架构时出错。无法访问给定密钥

如何解决此问题并使类型检查再次起作用?

1 个答案:

答案 0 :(得分:2)

出现此问题是因为SqlDataProvider<...>使用Windows注册表来查找.NET SDK路径,以便它知道SqlMetal.exe所在的位置。有关详细信息,请参阅'Util.fs' file

您可以按照以下步骤修复初始注册表问题。

  1. 在此处创建一个注册表文件夹(或根据您的Mono版本在类似的地方):

    /Library/Frameworks/Mono.framework/Versions/3.2.5/etc/mono/registry/

  2. 找到SqlMetal.exe。它的文件夹可能是我们将在下一步中使用的SDK安装位置。

  3. 手动添加类型提供程序需要的注册表项。您可以通过执行此操作在F#interactive中执行此操作(同样版本号可能需要更改):

    let key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools")
    key.SetValue("InstallationFolder", "/Library/Frameworks/Mono.framework/Versions/3.2.5/lib/mono/4.5/")
    
  4. 然而,这只能让你达到下一个错误。

      

    错误FS3033:类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告错误:读取架构时出错。找不到文件“/var/folders/03/fsl9pbz96sqdnsgxjqf6pmph0000gn/T/tmp72b90b49.dbml”。

    这是因为类型提供者将其他参数传递给SqlMetal.exe(例如/timeout:<value>),而Mono版本似乎假设最后一个参数是输出文件。

    看起来类型提供者或SqlMetal.exe需要更改。更改类型提供程序可能是最有意义的,因为我们可以删除Mono的注册表查找。如果类型提供程序被更改,它也将使部署更容易(即,您不必修复部署目标计算机上的单一注册表)。