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

4
我们需要在主实体框架应用程序的一个小部分中使用传统的 ADO 数据库连接。
我们可以在代码的这一部分手动指定连接字符串,但鉴于连接字符串已经存在于 App.Config 中,这似乎是多余的。
然而,当我们使用配置管理器检索连接字符串时,它会带有实体框架使用的所有元数据信息。
这会导致错误,因为 ADO 不识别元数据关键字。
我该如何解析此连接字符串以删除元数据并仅获取纯 ADO 连接字符串?
3个回答

7

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

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>

这只是给了我字符串“name=[NameOfConnectionString]”,而不是实际的字符串。 - Steven Wood
@StevenWood 不行,它不能。connectionDbConnection 类的一个实例(在 SQL Server 中它将是 SqlConnection)。这是一个普通的 ADO.NET 连接对象。它的连接字符串没有任何特定的 EF 元数据或来自配置文件的连接字符串 ID。 - Sergey Berezovskiy
由于我只是试图做与@StevenWood相同的事情,所以我偶然发现了您的帖子。而且,我在ConnectionString属性中仍然有EF元数据。请注意,根据MSDN的说法,此连接的实际内容取决于特定的数据源。在我的情况下,这是一个旧的EF4 ObjectContext。您说您正在使用DbContext,这可能会有所不同。 - Jens H

5
以下应该可以正常工作:
var efConn = new System.Data.EntityClient.EntityConnectionStringBuilder(efConnection);                     
string adoConn =  efConn.ProviderConnectionString;

1
这是一种更好的方法,因为它不需要处理实例化dbContext所需的所有工作,而是在内部仅解析ConnectionString。它在EF 6.1.2中运行得非常好。 - Gabriel Espinoza

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

这可能不是最优雅的解决方案,但它有效。
(我也尝试了正则表达式,但理解不了。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接