2013-06-03 46 views
16

Tôi có một phương pháp Mở rộng trên DbContext nơi tôi muốn thực hiện SqlBulkCopy. Do đó tôi cần một số SqlConnection. Kết nối từ DbContext là từ loại DbConnection. Trong số một vài điều khác tôi đã thử điều này:Nhận SqlConnection từ DbConnection

var connection = new SqlConnection(dbContext.Database.Connection.ConnectionString); 

Vấn đề là mật khẩu bị thiếu (có thể vì lý do bảo mật).

Một điều mà tôi đã cố gắng được upcasting:

var bulk_copy = new SqlBulkCopy((SqlConnection)dbContext.Database.Connection); 

Đó thực sự giả định các DbConnection là một SqlConnection. Trong trường hợp rất cụ thể này nó đã đi sai. Tôi đang sử dụng MVC MiniProfiler kết thúc tốt đẹp kết nối vào một EFProfiledDbConnection. EFProfiledDbConnection không kế thừa từ SqlConnection.

Bất kỳ ý tưởng nào khác? Cảm ơn trước!

+0

Không, SqlConnection cũng không SqlBulkCopy chấp nhận DbConnection làm đối số hàm tạo. –

+1

thử upcasting 'DbConnection' thành' SqlConnection' –

+0

Xin lỗi, tôi đã thử điều đó nhưng quên thêm nó vào câu hỏi. Tôi đã cập nhật câu hỏi của mình. –

Trả lời

7

Một trong những cách có thể để làm việc này là thêm Persist Security Info=true vào chuỗi kết nối của bạn.

+0

Tôi không thực sự quen thuộc với Thông tin Bảo mật Persist. Nghe có vẻ một chút quyết liệt cho một cái gì đó mà hy vọng có thể được giải quyết một chút thanh lịch hơn. Những hạn chế là gì? –

+1

Thông tin bảo mật liên tục giữ lại mật khẩu của bạn trong bộ nhớ, nếu không nó sẽ bị xóa, do đó làm cho chuỗi kết nối của bạn không sử dụng được khi cố gắng sử dụng lại nó. Tôi không nghĩ rằng có những hạn chế bạn nên lo lắng, giả sử rằng chuỗi kết nối được cung cấp trong tập tin cấu hình. –

+1

Cách tiếp cận trang nhã nhất sẽ là chuyển sang bảo mật tích hợp để không có tên người dùng/mật khẩu trong chuỗi kết nối của bạn mà đúng hơn là 'Tích hợp bảo mật = true'. –

11

Vâng, nếu cả hai có thể chia sẻ cùng một Connection String thì tôi đoán chúng đều là SqlConnection.

Hãy thử điều này thay vì:

var connection = rep.Database.Connection as SqlConnection; 
+0

Xin lỗi, tôi đã cố gắng nhưng đã quên thêm nó vào câu hỏi. Tôi đã cập nhật câu hỏi của mình. –

+8

Để bất kỳ trình duyệt nào trong tương lai xem xét câu hỏi này. Trong khi câu trả lời này không hoạt động cho OP, nói chung DbConnection thường là một thể hiện của SqlConnection. Vì vậy, bạn nên kiểm tra xem liệu điều này có hiệu quả đối với trường hợp cụ thể của bạn hay không. –

1

Bạn có thể kiểm tra các loại dbContext.Database.Connection. Nếu đó là số EFProfiledDbConnection bạn có thể nhận được thuộc tính WrappedConnection, trả về số DbConnection. Đó là SqlConnection nếu bạn sử dụng Sql Server.

+0

Tôi có thể làm điều này nếu không có giải pháp nào khác. Nhưng tôi nghĩ nó khá xấu xí. Kiểm tra các loại có mùi giống như mã xấu và là thứ tôi muốn ngăn chặn. Điều này cũng có nghĩa là thêm một tham chiếu đến MiniProfiler trong assembly này (MiniProfiler bây giờ chỉ được tham chiếu trong assembly Web của tôi). Một bất lợi khác là có thể có một loại DbConnection khác trong tương lai mà tôi không tính đến, và đoạn mã lại bị phá vỡ. –

+0

Bạn có thể quấn nó trong chính bối cảnh, ví dụ: trong phương thức 'GetConnection()'. Các hội đồng khác sẽ không cần tham chiếu đến MiniProfiler. –

2

Chỉ cách tôi phát hiện ra cho đến nay là sử dụng System.Configuration thư viện:

var sqlConnString = ConfigurationManager.ConnectionStrings["your_conn_string_name"].ConnectionString; 
var bulkCopy = new SqlBulkCopy(sqlConnString); 
+0

đôi khi bạn muốn sử dụng kết nối hiện có vì các giao dịch bị rasons. – gsharp

2

Tôi đã có một vấn đề tương tự với ProfiledConnection (HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledConnection)

và những gì Tôi cần là SqlConnection, điều này đã thực hiện thủ thuật:

ProfiledConnection profiledConnection = dbContext.Database.Connection as ProfiledConnection; 
SqlConnection sqlConnection = (SqlConnection)profiledConnection.Inner;