12

我正在使用类型表达式:

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

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

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

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

4

2 回答 2

1

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

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

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

...或者如果您还想让它在 F# 交互中工作,请像这样包装它:

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

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

于 2015-08-25T13:27:25.230 回答
0

我在这台 PC 上没有 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>
于 2012-12-23T18:55:05.363 回答