Подтвердить что ты не робот

Как предполагается использовать F # SqlDataConnection TypeProvider с файлом App.Config?

Я использую выражение типа:

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

Это отлично работает во время компиляции (у меня есть полный доступ ко всем типам db), но он не работает во время выполнения. Я предполагаю, потому что файл конфигурации, сгенерированный в каталоге консольного приложения bin, называется чем-то другим, например MyAppName.exe.config, и поэтому файл App.config не найден.

Конечно, для приложения типа ASP.NET MVC, использующего web.config, нет проблемы, потому что имена файлов конфигурации компиляции и runtime совпадают.

К счастью, размещение дубликата App.config в каталоге bin устраняет проблему, но это то, что мы должны делать? Любые мысли?

4b9b3361

Ответ 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.)

Ответ 2

У меня нет 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>