【问题标题】:Using an entity framework connection string in ADO在 ADO 中使用实体框架连接字符串
【发布时间】:2014-05-15 10:45:48
【问题描述】:

我们需要在主实体框架应用程序的一小部分中使用老式的 ADO 数据库连接。

我们可以在这部分代码中手动指定连接字符串,但鉴于连接字符串已经存在于 App.Config 中,这似乎是多余的。

但是,当我们使用配置管理器来检索连接字符串时,它会带来实体框架使用的所有元数据。

这会导致错误,因为 ADO 无法识别元数据关键字。

如何解析此连接字符串以删除元数据并仅获取纯 ADO 连接字符串?

【问题讨论】:

    标签: c# entity-framework ado.net connection-string


    【解决方案1】:

    你可以从DbContext获取DbConnection实例:

    var context = new YourDbContext();
    var connection = context.Database.Connection;
    

    当然,你可以从连接中获取连接字符串,但你不需要,因此你可以使用已经存在的连接对象。


    这里是 connection 对象的快速观看 - 正如您所看到的,它是带有序号连接字符串的简单 ADO.NET SqlConnection 对象。

    在配置文件中,我有带有元数据的实体框架连接字符串:

      <connectionStrings>
        <add name="NorthwindEntities"
             connectionString="metadata=res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Northwind;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
             providerName="System.Data.EntityClient" />
      </connectionStrings>
    

    【讨论】:

    • 这只是给了我字符串 "name=[NameOfConnectionString]" 而不是实际的字符串
    • @StevenWood 不,它不能。 connectionDbConnection 类的一个实例(对于 SQL 服务器,它将是 SqlConnection)。这是一个有序的 ADO.NET 连接对象。并且它的连接字符串没有任何特定的 EF 元数据或配置文件中的连接字符串 id
    • 因为我只是想和@StevenWood 一样,我偶然发现了你的帖子。我也仍然在ConnectionString 属性中拥有EF 元数据。请注意,according to MSDN 的实际内容取决于此连接的特定数据源。在我的情况下,这是一个旧的 EF4 ObjectContext。您说您使用的是DbContext,这可能会有所作为。
    【解决方案2】:

    下面应该工作:

    var efConn = new System.Data.EntityClient.EntityConnectionStringBuilder(efConnection);                     
    string adoConn =  efConn.ProviderConnectionString;
    

    【讨论】:

    • 这是一种更好的方法,因为它不处理实例化 dbContext 所需的所有工作,而是在内部仅解析 ConnectionString。它与 EF 6.1.2 一起工作就像一个魅力
    【解决方案3】:

    我也尝试过,最终使用了这种方法:

    private static string RemoveEntityFrameworkMetadata(string efConnection)
    {
      int start = efConnection.IndexOf("\"", StringComparison.OrdinalIgnoreCase);
      int end   = efConnection.LastIndexOf("\"", StringComparison.OrdinalIgnoreCase);
    
      // We do not want to include the quotation marks
      start++;
      int length = end - start;
    
      string pureSqlConnection = entityFrameworkConnection.Substring(start, length);
      return pureSqlConnection;
    }
    

    这可能不是最优雅的解决方案,但它确实有效。

    (我也尝试过 Regex,但无法理解它。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      相关资源
      最近更新 更多