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

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

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

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

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

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


person Clifford Ritchie    schedule 07.12.2012    source источник
comment
Так работает App.config. Сначала ищется вызывающая сборка верхнего уровня. Подробности см. в этом вопросе. Также обратите внимание, что App.config на самом деле переименовывается в MyAppName.exe.config во время сборки, и вам может потребоваться правильный вызов только что созданного.   -  person bytebuster    schedule 07.12.2012
comment
@bytebuster Это, безусловно, правда. Однако поставщик типа SqlDataConnection, похоже, не знает об этом факте и по-прежнему настаивает на наличии файла app.config, даже если ConfigFile не указано явно (в этом случае app.config следует использовать по умолчанию).   -  person afrischke    schedule 08.12.2012
comment
Я сам думал об этом. Возможно, вы найдете этот вопрос и ответ полезным: stackoverflow.com/a/19459561/952606   -  person spacedoom    schedule 20.10.2013


Ответы (2)


Описание того, как работает определение провайдера типа, вводит в заблуждение - значение в 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.)

person Overlord Zurg    schedule 25.08.2015
comment
Это примерно тот же ответ, который был связан с SpaceDoom выше. - person Overlord Zurg; 25.08.2015

У меня нет 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>
person andri    schedule 23.12.2012
comment
Не повезло! Компилятор говорит для configfile: это не постоянное выражение или допустимое значение пользовательского атрибута. - person Clifford Ritchie; 29.01.2013