我有这个小方法,它应该创建一个名为 DataSource 的自定义对象:
private static DataSource BuildDataSourceFromString(string connectionString)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
DataSource dbConnection = new DataSource()
{
Source = builder.DataSource,
Catalog = builder.InitialCatalog
};
return dbConnection;
}
我使用这个类 (SqlConnectionStringBuilder
) 的主要原因是为了方便地抓取目录和数据源。
当我向它传递 Entity Framework 连接字符串(并初始化 SqlConnectionStringBuilder
)时,我得到以下异常:
Keyword not supported: 'metadata'
我可以开始分析字符串以检查和区分 Entity Framework 连接字符串和经典连接字符串,但我真的想要一些优雅的东西来解决它们,而代码不必“知道”它(因为我在我的项目)。
这是失败的连接字符串示例:
<add name="someconnectionstring"
connectionString="metadata=res://*/DB.SomeDataModel.csdl|res://*/DB.SomeDataModel.ssdl|res://*/DB.SomeDataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=some-data-source;initial catalog=SomeCatalog;integrated security=True;MultipleActiveResultSets=True;MultiSubnetFailover=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
这个错误不会发生在像这样的经典连接字符串中:
<connectionStrings>
<add name="SomeData"
connectionString="Server=Some-Server;Database=SomeCatalog;Integrated Security=SSPI;"
providerName="System.Data.sqlclient" />
</connectionStrings>
关于获取两种连接字符串的优雅的建议?除了 SqlConnectionStringBuilder
之外,还有其他我可以使用的东西吗?也许我应该在尝试构建它之前截断一些冗余字符串并将其从 Entity Framework 连接字符串中删除?
提前致谢。
最佳答案
我一直在使用自己创建的这个方法。也许这不是最优雅的解决方案,但它确实有效:
private static string FilterConnectionString(string connectionStringEntity, bool useProvider = true)
{
string result = "";
string[] split = connectionStringEntity.Split(new char[2] { ';', '"' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item1 in split)
{
string item = item1.Trim();
if (item.ToLower().StartsWith("data source") ||
item.ToLower().StartsWith("initial catalog") ||
item.ToLower().StartsWith("user id") ||
item.ToLower().StartsWith("password") ||
item.ToLower().StartsWith("multipleactiveresultSets"))
result += item + ";";
}
return useProvider ? result + "provider=System.Data.SqlClient" : result;
}
您可以使用此过滤后的 connectionString 创建一个 SqlConnectionStringBuilder,或修改此方法以提取数据源和初始目录。
关于c# - 将 SqlConnectionStringBuilder 用于 EF 连接字符串会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43979704/