2012-12-07 11 views
12

Ben tip ifadesini kullanıyorum: Bu derleme zamanında iyi çalışıyorF # SqlDataConnection TürProviderini bir App.Config dosyasıyla nasıl kullanacaksınız?

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

(tüm db tiplerine tam erişime sahip), ancak çalışma zamanında başarısız olur. Bunun nedeni, konsol uygulamasının bin dizininde oluşturulan yapılandırma dosyasının MyAppName.exe.config gibi başka bir adla adlandırıldığından ve bu nedenle App.config dosyasının bulunmadığını varsayıyorum. derleme ve çalışma zamanı yapılandırma dosya adları aynı olduğu için

Elbette web.config kullanan bir ASP.NET MVC tip uygulama için, hiçbir sorun yok.

Neyse ki,dizinindeki bir App.config kopyasını yerleştirmek sorunu gidermeye yardımcı oluyor, ancak yapmamız gereken şey bu mu? Düşüncesi olan var mı?

+3

Bu App.config' nasıl çalıştığını 'yoludur. Öncelikle üst düzey bir çağrı montajı için aranıyor. Ayrıntılar için [bu Q] 'ya bakın (http://stackoverflow.com/questions/3569336/visual-c-sharp-app-config-file-for-a-referenced-assembly). Ayrıca, uygulama sırasında 'App.config'un' MyAppName.exe.config' olarak yeniden adlandırıldığını ve yeni oluşturulmuş olanı doğru aramanız gerekebilir. – bytebuster

+0

@bytebuster Bu kesinlikle doğrudur. Ancak SqlDataConnection türü sağlayıcısı bu gerçeğin farkında değil gibi görünüyor ve hala "config.Fardı" açıkça belirtilmemiş olsa bile orada olmak için "app.config" dosyasında ısrar ediyor (bu durumda app.config olarak kullanılması gerekir) varsayılan.) – afrischke

+0

Bunu kendim düşünüyordum. Belki bu soruyu bulabilir ve yardımcı olabilirsiniz: http://stackoverflow.com/a/19459561/952606 – spacedoom

cevap

0

Bu PC'de VS2012 yok ama bu aradığınızı olmalıdır:

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

Hayır şans! Derleyici, "configfile" için şöyle diyor: "Bu, sabit bir ifade veya geçerli bir özel özellik değeri değil. –

1

tip sağlayıcı tanımı nasıl çalıştığının açıklaması yanıltıcı - typedef değer gerçekten sadece kod/derleme zamanında ve çalışma zamanında bir varsayılan olarak önemlidir. Ancak, belirttiğiniz gibi, çalışma zamanında doğru yapılandırma dosyasını bulmak akıllıca değildir.

Sen GetDataContext parametre olarak bağlantı dizesi geçirerek istediğini başarabilirsiniz:

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

... ya da yapmak istiyorsanız bu interaktif F # işe şöyle sar:

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

(Eğer System.Configuration bir başvuru gerekeceğini unutmayın.)

+0

Bu, yukarıdaki spacedoom tarafından bağlanmış olan aynı yanıttır. –