我正在使用类型表达式:
type dbSchema = SqlDataConnection<ConnectionStringName="X1", ConfigFile="App.config">
这在编译时运行良好(我可以完全访问所有数据库类型),但它在运行时失败。我认为这是因为在控制台应用程序的bin
目录中生成的配置文件被命名为其他内容,例如MyAppName.exe.config
,因此找不到App.config
文件。
当然,对于使用web.config
的 ASP.NET MVC 类型的应用程序,没有问题,因为编译和运行时配置文件名是相同的。
幸运的是,在App.config
目录中放置一个重复的bin
可以解决问题,但这是我们应该做的吗?有什么想法吗?
答案 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>