如何将F#SqlDataConnection TypeProvider与App.Config文件一起使用?

时间:2012-12-07 18:17:42

标签: f# app-config

我正在使用类型表达式:

type dbSchema = SqlDataConnection<ConnectionStringName="X1", ConfigFile="App.config">

这在编译时运行良好(我可以完全访问所有数据库类型),但它在运行时失败。我认为这是因为在控制台应用程序的bin目录中生成的配置文件被命名为其他内容,例如MyAppName.exe.config,因此找不到App.config文件。

当然,对于使用web.config ASP.NET MVC 类型的应用程序,没有问题,因为编译和运行时配置文件名是相同的。

幸运的是,在App.config目录中放置一个重复的bin可以解决问题,但这是我们应该做的吗?有什么想法吗?

2 个答案:

答案 0 :(得分:1)

类型提供程序定义如何工作的描述具有误导性 - typedef中的值实际上仅在代码/编译时起作用,并且在运行时作为缺省值。但是,正如您所指出的那样,在运行时找到正确的配置文件并不是很明智。

您可以通过将连接字符串作为参数传递给GetDataContext来完成您想要的任务:

type dbSchema = SqlDataConnection<ConnectionStringName="X2">
let db = dbSchema.GetDataContext(ConfigurationManager.ConnectionStrings.["X2"].ConnectionString)

...或者如果你还想让它在F#interactive中工作,请将它包装成:

type dbSchema = SqlDataConnection<ConnectionStringName="X2">
#if COMPILED
let db = dbSchema.GetDataContext(ConfigurationManager.ConnectionStrings.["X2"].ConnectionString)
#else
let db = dbSchema.GetDataContext()
#endif

(请注意,您需要对System.Configuration的引用。)

答案 1 :(得分:0)

我在这台电脑上没有VS2012,但这应该是你想要的:

let exeConfigFile = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) + ".config"
let defaultConfigFile = "App.config"
let configFile = if File.Exists(exeConfigFile) then exeConfigFile else defaultConfigFile

type dbSchema = SqlDataConnection<ConnectionStringName="X1", ConfigFile=configFile>