当我使用SqlDataProvider<ConnectionString = "...">
类型提供程序时,它会在Visual Studio和Windows下的Xamarin Studio中进行类型检查。但是,在Mac OS X下的Xamarin Studio中,它失败并出现以下错误:
错误FS3033:类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告错误:读取架构时出错。无法访问给定密钥
如何解决此问题并使类型检查再次起作用?
答案 0 :(得分:2)
出现此问题是因为SqlDataProvider<...>
使用Windows注册表来查找.NET SDK路径,以便它知道SqlMetal.exe
所在的位置。有关详细信息,请参阅'Util.fs' file。
您可以按照以下步骤修复初始注册表问题。
在此处创建一个注册表文件夹(或根据您的Mono版本在类似的地方):
/Library/Frameworks/Mono.framework/Versions/3.2.5/etc/mono/registry/
找到SqlMetal.exe
。它的文件夹可能是我们将在下一步中使用的SDK安装位置。
手动添加类型提供程序需要的注册表项。您可以通过执行此操作在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/")
然而,这只能让你达到下一个错误。
错误FS3033:类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告错误:读取架构时出错。找不到文件“/var/folders/03/fsl9pbz96sqdnsgxjqf6pmph0000gn/T/tmp72b90b49.dbml”。
这是因为类型提供者将其他参数传递给SqlMetal.exe
(例如/timeout:<value>
),而Mono版本似乎假设最后一个参数是输出文件。
看起来类型提供者或SqlMetal.exe
需要更改。更改类型提供程序可能是最有意义的,因为我们可以删除Mono的注册表查找。如果类型提供程序被更改,它也将使部署更容易(即,您不必修复部署目标计算机上的单一注册表)。