【问题标题】:Get SqlConnection from DbConnection从 DbConnection 获取 SqlConnection
【发布时间】:2013-06-03 20:17:32
【问题描述】:

我在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。

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

【问题讨论】:

  • 不,SqlConnection 和 SqlBulkCopy 都不接受 DbConnection 作为构造函数参数。
  • 尝试将DbConnection向上转换为SqlConnection
  • 抱歉,我已经尝试过了,但忘记将其添加到问题中。我已经更新了我的问题。
  • 那就试试我的方法——看看我的答案。

标签: c# sql entity-framework connection-string mvc-mini-profiler


【解决方案1】:

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

试试这个:

var connection = rep.Database.Connection as SqlConnection;

【讨论】:

  • 抱歉,我已经尝试过了,但忘记将其添加到问题中。我已经更新了我的问题。
  • 对于任何未来查看此问题的浏览器。虽然这个答案不适用于 OP,但通常 DbConnection 通常是 SqlConnection 的一个实例。因此,您应该检查一下这是否适用于您的特定实例。
【解决方案2】:

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

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

【讨论】:

  • 有时您想使用现有的连接,因为交易原因。
【解决方案3】:

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

而我需要的是 SqlConnection,这成功了:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我对 Persist Security Info 不是很熟悉。对于希望可以更优雅地解决的问题,这听起来有点激烈。有什么缺点?
    • Persist Security Info 将您的密码保留在内存中,否则它将被清除,从而使您的连接字符串在尝试重用时无法使用。假设配置文件中提供了连接字符串,我认为您不必担心有缺点。
    • 最优雅的方法是切换到集成安全性,这样您的连接字符串中就没有用户名/密码,而是 - Integrated security=true
    • 好的,我会去看看!由于我使用 SQL Azure,因此无法实现集成安全性。
    • 这样保存安全信息几乎没有风险。或者更确切地说 - 风险只是理论上的。
    【解决方案5】:

    你可以用这个:

    SqlConnection sqlConn = dbContext.Database.GetConnection<SqlConnection>()
    

    【讨论】:

      【解决方案6】:

      你可以使用:

      (SqlConnection)context.Database.GetDbConnection()
      

      这会创建包含 pass 的 SQL 连接对象的副本。

      【讨论】:

      • 不是副本。 “获取此 DbContext 的基础 ADO.NET DbConnection。”问题表明这种联系不是他们想要的。
      【解决方案7】:

      您可以查看dbContext.Database.Connection 的类型。如果它是一个EFProfiledDbConnection,您可以获得它的WrappedConnection 属性,它返回一个DbConnection。如果您使用 SQL Server,那就是 SqlConnection

      【讨论】:

      • 如果真的没有其他解决方案,我可能会这样做。但我认为它非常丑陋。检查类型闻起来像糟糕的代码,这是我宁愿阻止的事情。这也意味着在此程序集中添加对 MiniProfiler 的引用(MiniProfiler 现在仅在我的 Web 程序集中引用)。另一个缺点是以后可能还有另一种我没有考虑到的DbConnection,代码又断了。
      • 您可以将其包装在上下文本身中,例如在GetConnection() 方法中。其他程序集不需要对 MiniProfiler 的引用。
      【解决方案8】:

      如果您使用的是较新的 .NET Core:

      new SqlConnection(kontext.Database.GetConnectionString())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        相关资源
        最近更新 更多