2012-12-07 11 views
12

używam wyrażenia typu:Jak należy używać usługi F # SqlDataConnection TypeProvider z plikiem App.Config?

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

Działa to doskonale w czasie kompilacji (mam pełny dostęp do wszystkich typów dB), ale nie w czasie wykonywania. Zakładam, że dzieje się tak dlatego, że plik konfiguracyjny wygenerowany w katalogu aplikacji konsolowej bin został nazwany czymś innym, na przykład MyAppName.exe.config, dlatego też nie znaleziono pliku .

Oczywiście, dla ASP.NET MVC typu aplikacji, która korzysta web.config, nie ma problemu, ponieważ nazwy plików kompilacji i czasu wykonywania konfiguracyjne są takie same.

Na szczęście umieszczenie duplikatu App.config w katalogu bin rozwiązuje problem, ale czy to jest to, co powinniśmy zrobić? jakieś pomysły?

+3

to jest sposób w jaki 'App.config' działa. Najpierw jest poszukiwany zestaw wywołań najwyższego poziomu. Aby uzyskać szczegółowe informacje, patrz [this Q] (http://stackoverflow.com/questions/3569336/visual-c-sharp-app-config-file-for-a-referenced- assembly). Zauważ również, że 'App.config' jest faktycznie przemianowany na' MyAppName.exe.config' podczas budowania czasu i możesz potrzebować odpowiedniego wywołania swojego nowo utworzonego. – bytebuster

+0

@bytebuster To z pewnością prawda. Jednak dostawca typu SqlDataConnection nie wydaje się być tego świadomy i nadal nalega, aby plik "app.config" był tam, nawet jeśli 'ConfigFile' nie jest jawnie określony (w takim przypadku app.config powinien być użyty jako domyślnie.) – afrischke

+0

Myślałem o tym sam. Może znajdziesz to pytanie i odpowiedź pomocne: http://stackoverflow.com/a/19459561/952606 – spacedoom

Odpowiedz

0

nie mają VS2012 na tym komputerze, ale to powinno być to, czego szukasz:

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

Bez powodzenia! Kompilator mówi o 'configfile':" To nie jest stałe wyrażenie lub poprawna wartość atrybutu niestandardowego. " –

1

Opis sposobu działania definicja typu dostawca jest mylące - wartość w typedef naprawdę ma znaczenie tylko w czasie kodu/kompilacji i domyślnie w środowisku wykonawczym. Jednak, jak już zauważyłeś, nie jest zbyt mądre znalezienie odpowiedniego pliku konfiguracyjnego w środowisku wykonawczym.

Można osiągnąć to, co chcesz, przekazując ciąg połączenia jako parametr do GetDataContext:

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

... a jeśli chcesz, aby pracować w F # interaktywne, owinąć go tak:

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

(należy pamiętać, że trzeba będzie odniesienie do System.Configuration.)

+0

Jest to w przybliżeniu ta sama odpowiedź, która została powiązana z położeniem powyżej. –

Powiązane problemy