我们需要在主要实体框架应用程序的一小部分中使用旧式ADO数据库连接。
我们可以在这部分代码中手动指定连接字符串,但鉴于连接字符串已经存在于App.Config中,这似乎是多余的。
但是,当我们使用配置管理器检索连接字符串时,它会带来实体框架使用的所有元数据内容。
这会导致错误,因为ADO无法识别元数据关键字。
如何解析此连接字符串以删除元数据并获取普通的ADO连接字符串?
答案 0 :(得分:6)
您可以从DbConnection
获取DbContext
个实例:
var context = new YourDbContext();
var connection = context.Database.Connection;
当然,您可以从连接中获取连接字符串,但是您不需要这样就可以使用已有的连接对象。
以下是connection
对象的快速监视 - 您可以看到它是带有序号连接字符串的简单ADO.NET SqlConnection对象。
在配置文件中,我有Entity Framework连接字符串和元数据:
<connectionStrings>
<add name="NorthwindEntities"
connectionString="metadata=res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=Northwind;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""
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,但无法理解它。)