2012-12-07 24 views
12

我使用的類型表達式:如何使用F#SqlDataConnection TypeProvider與App.Config文件?

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

此工程在編譯時大(我可以完全訪問所有的數據庫類型),但它在運行時出現故障。我認爲這是因爲控制檯應用程序bin目錄中生成的配置文件被命名爲其他內容,例如MyAppName.exe.config,因此找不到App.config文件。

當然,對於使用web.configASP.NET MVC類型的應用程序,也沒有問題,因爲在編譯和運行時的配置文件名是相同的。

幸運的是,在bin目錄中放置重複的App.config可以解決問題,但這是我們所期望的嗎?有什麼想法嗎?

+3

這是App.config'如何'的工作方式。它首先正在尋找一個頂級調用程序集。有關詳細信息,請參見[this Q](http://stackoverflow.com/questions/3569336/visual-c-sharp-app-config-file-for-a-referenced-assembly)。另外請注意,在編譯期間'App.config'實際上被重命名爲'MyAppName.exe.config',您可能需要正確調用您新創建的一個。 – bytebuster

+0

@bytebuster這當然是對的。然而,SqlDataConnection類型提供者似乎並沒有意識到這個事實,並且仍然堅持文件「app.config」在那裏,即使「ConfigFile」沒有明確指定(在這種情況下應該使用app.config作爲默認) – afrischke

+0

我一直在想這個。也許你會發現這個問題和答案有幫助: http://stackoverflow.com/a/19459561/952606 – spacedoom

回答

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> 
+0

不幸的是!編譯器對'configfile'說:「這不是一個常量表達式或有效的自定義屬性值。」 –

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參考。)

+0

這與上面的空間鏈接相同。 –

相關問題