c# - 将 SqlConnectionStringBuilder 用于 EF 连接字符串会引发异常

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

我有这个小方法,它应该创建一个名为 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=&quot;data source=some-data-source;initial catalog=SomeCatalog;integrated security=True;MultipleActiveResultSets=True;MultiSubnetFailover=True;App=EntityFramework&quot;" 
     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/

相关文章:

c# - 这是我为控件设置事件的最佳方式吗?

c# - 数据访问后在 C# 中关闭 Excel 应用程序进程

C# 通用的泛型类型推断

mysql - 带有 MySQL 的 ASP.NET MVC 4 EF5

c# - EF 5 迁移无法连接到我们的数据库,即使它在运行时运行良好

c# - MVC4 复杂类型模型在发布后为空

c# - 检测 UWP 应用程序正在小屏幕设备(电话)上运行的正确方法

c# - 填充可为空的小数时,小数会四舍五入,为什么?

c++ - gcroot 的这种用法安全吗?

c# - 确定某个 URL 是否位于某个目录中的正确方法是什么?