在ADO中使用实体框架连接字符串

时间:2014-05-15 10:45:48

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

您可以从DbConnection获取DbContext个实例:

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

当然,您可以从连接中获取连接字符串,但是您不需要这样就可以使用已有的连接对象。


以下是connection对象的快速监视 - 您可以看到它是带有序号连接字符串的简单ADO.NET SqlConnection对象。

enter image description here

在配置文件中,我有Entity Framework连接字符串和元数据:

  <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>

答案 1 :(得分:4)

下面应该有效:

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

答案 2 :(得分:1)

我尝试了同样的方法并最终使用了这种方法:

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,但无法理解它。)