2012-12-07 21 views
12

Tôi đang sử dụng biểu thức loại:Làm thế nào là một trong những nghĩa vụ phải sử dụng F # SqlDataConnection TypeProvider với một tập tin App.Config?

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

này hoạt động tuyệt vời tại thời gian biên dịch (Tôi có thể truy cập vào tất cả các loại db), nhưng nó không thành công tại thời gian chạy. Tôi đoán đó là vì tệp cấu hình được tạo trong thư mục bin của ứng dụng bảng điều khiển được đặt tên khác, chẳng hạn như MyAppName.exe.config và do đó không tìm thấy tệp App.config.

Chắc chắn, đối với ứng dụng loại ASP.NET MVC sử dụng web.config, không có vấn đề gì vì tên tệp cấu hình và biên dịch thời gian chạy giống nhau.

May mắn thay, đặt một bản sao App.config trong thư mục bin sẽ khắc phục sự cố, nhưng đó có phải là những gì chúng tôi dự kiến ​​sẽ làm không? Có suy nghĩ gì không?

+3

Đây là cách sao 'App.config' hoạt động. Đây là lần đầu tiên được tìm kiếm cho một hội nghị kêu gọi cấp cao nhất. Xem [this Q] (http://stackoverflow.com/questions/3569336/visual-c-sharp-app-config-file-for-a-referenced-assembly) để biết chi tiết. Cũng lưu ý rằng 'App.config' thực sự được đổi tên thành' MyAppName.exe.config' trong suốt thời gian xây dựng và bạn có thể cần phải gọi đúng tên vừa tạo của bạn. – bytebuster

+0

@bytebuster Đó chắc chắn là sự thật. Tuy nhiên, nhà cung cấp loại SqlDataConnection dường như không nhận thức được thực tế này và vẫn nhấn mạnh vào tệp "app.config" để ở đó, ngay cả khi 'ConfigFile' không được chỉ định rõ ràng (trong trường hợp đó app.config nên được sử dụng như mặc định.) – afrischke

+0

Tôi đã tự nghĩ về điều này. Có thể bạn sẽ tìm thấy câu hỏi và câu trả lời này hữu ích: http://stackoverflow.com/a/19459561/952606 – spacedoom

Trả lời

0

Tôi không có một VS2012 trên máy tính này nhưng điều này nên được những gì bạn đang tìm kiếm:

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

Không may mắn! Trình biên dịch nói cho 'configfile':" Đây không phải là biểu thức liên tục hoặc giá trị thuộc tính tùy chỉnh hợp lệ. –

1

Các mô tả về cách định nghĩa nhà cung cấp loại công trình là gây hiểu nhầm - giá trị trong typedef thực sự chỉ có vấn đề ở mã/thời gian biên dịch, và như là một mặc định trong thời gian chạy. Tuy nhiên, như bạn đã lưu ý, nó không phải là rất thông minh về việc tìm kiếm các tập tin cấu hình đúng lúc chạy.

Bạn có thể thực hiện những gì bạn muốn bằng cách đi qua các chuỗi kết nối như một tham số để GetDataContext:

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

... hoặc nếu bạn cũng muốn làm cho nó làm việc trong F # tương tác, quấn nó như vậy:

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

(Lưu ý rằng bạn sẽ cần một tham chiếu đến System.Configuration.)

+0

Đây là câu trả lời giống như đã được liên kết bởi khoảng cách trên. –

Các vấn đề liên quan