从DbConnection获取SqlConnection

问题描述 投票:23回答:6

我在DbContext上有一个扩展方法,我想做一个SqlBulkCopy。因此我需要一个SqlConnection。来自DbContext的连接来自DbConnection类型。在其他一些事情我试过这个:

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

问题是密码丢失(可能出于安全原因)。

我尝试的另一件事是向上转换:

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

这实际上假设DbConnection是一个SqlConnection。在这个非常具体的案例中,它已经出错了。我正在使用MVC MiniProfiler将连接包装成EFProfiledDbConnection。 EFProfiledDbConnection不从SqlConnection继承。

还有其他想法吗?提前致谢!

c# sql entity-framework connection-string mvc-mini-profiler
6个回答
17
投票

好吧,如果两者都可以共享相同的Connection String,那么我猜他们都是SqlConnection

试试这个:

var connection = rep.Database.Connection as SqlConnection;

7
投票

解决此问题的一种可能方法是将Persist Security Info=true添加到连接字符串中。


3
投票

我在ProfiledConnection上遇到了类似的问题(HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledConnection)

我需要的是SqlConnection,这就是诀窍:

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

2
投票

到目前为止我发现的唯一方法是使用System.Configuration库:

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

1
投票

你可以检查dbContext.Database.Connection的类型。如果它是EFProfiledDbConnection你可以得到它的WrappedConnection属性,它返回一个DbConnection。如果您使用Sql Server,这是一个SqlConnection


-1
投票

您可以使用以下代码:

SqlConnection sqlConn=dbContext.Database.GetConnection<SqlConnection>()
© www.soinside.com 2019 - 2024. All rights reserved.