12

私は型式を使用しています:

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

これはコンパイル時にはうまく機能しますが (すべての db タイプに完全にアクセスできます)、実行時には失敗します。コンソール アプリケーションのbinディレクトリに生成された構成ファイルの名前MyAppName.exe.configApp.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 に答える