EF Core 3.0 手动设置连接字符串

Posted

技术标签:

【中文标题】EF Core 3.0 手动设置连接字符串【英文标题】:EF Core 3.0 Manually setting connection string 【发布时间】:2019-06-26 08:35:32 【问题描述】:

我正在使用 .NET Core 和 EF Core(均为 v3.0)开发控制台应用程序;我需要使用从另一个类生成的字符串来启动我的 DbContext。

DbContext 文件

public Arta_LuniaDBContext()  

public Arta_LuniaDBContext(DbContextOptions<Arta_LuniaDBContext> options) : base(options)  

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

   optionsBuilder.UseSqlServer(DataServices.ConnectionString);

数据服务类

public static string ConnectionString  get  return GetConnectionData();  

private static string GetConnectionData()

   /// Sets the Server name, Database, UserId and Password.
   string Server, Database, UserId, Password;

   /// Sets the separator.
   string Separator = ";";

   /// Connection string [internal].
   string ArtaConn = null;

   /// Loads Settings.xml
   XmlDocument xDoc = new XmlDocument();
   xDoc.Load("Settings.xml");

   /// Gets the XmlNode: DataSource
   XmlNodeList xSource = xDoc.GetElementsByTagName("DataSource");
   for (int i = 0; i < xSource.Count; i++)
   
      /// Sets the Server name.
      Server = "Server=" + xSource[i].Attributes["Server"].Value + Separator;

      /// Sets the Database.
      Database = "Database=" + xSource[i].Attributes["Database"].Value + Separator;

      /// Sets the User id.
   UserId = "User id=" + xSource[i].Attributes["UserId"].Value + Separator;

      /// Sets the Password.
      Password = "Password=" + xSource[i].Attributes["Password"].Value + Separator;

      /// Builds the connection string.
      ArtaConn = Server + Database + UserId + Password;
      Colorful.Console.WriteLine(ArtaConn, System.Drawing.Color.Yellow);
      // I'm using this line to test the output.
   

   /// Returns~
   return ArtaConn;

Settings.xml

<!-- Sets the Database ConnectionString -->
<DataSource Server="IP_ADDRESS\\INSTANCE" Database="DbName" UserId="MyUser" Password="MyPassword" />

ConsoleWrite 行显示我的输出为:

Server=IP_ADDRESS\\INSTANCE;Database=DbName;User id=MyUser;Password=MyPassword;

这个字符串对我来说似乎没问题,但是当我尝试连接到数据库时,我收到以下错误:

System.Data.SqlClient.SqlException (0x80131904):网络相关或 建立连接时发生特定于实例的错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。 (提供者:SQL 网络接口,错误:26 - 定位服务器/指定实例时出错)

很奇怪,如果我设置的话:

optionsBuilder.UseSqlServer("IP_ADDRESS\\INSTANCE;Database=DbName;User id=MyUser;Password=MyPassword;");

我可以毫无问题地连接……

有什么办法可以解决吗?提前致谢。

[编辑] 修复它; 更改:

<DataSource Server="IP_ADDRESS\\INSTANCE" Database="DbName" UserId="MyUser" Password="MyPassword" />

收件人:

<DataSource Server="IP_ADDRESS\INSTANCE" Database="DbName" UserId="MyUser" Password="MyPassword" />

【问题讨论】:

您是否在问题中提供了实际密码? 如果您想要一个不硬编码代码中的连接字符串的简单解决方案,您可以通过配置变量存储硬编码的连接字符串来组合上述两种方法,然后访问该配置变量在您对 optionsBuilder.UseSqlServer 的调用中。另外,您真的不应该将整个连接字符串(包括密码)发布到本网站上供所有人查看! 糟糕,已修复连接密码和详细信息。 :p 该密码在历史记录中仍然可用。最好改一下。 您可能对此信息感兴趣:如何删除历史记录。另请注意@jdv:更改密码。 meta.stackexchange.com/questions/86195/… 【参考方案1】:

为工作使用正确的工具 - SqlConnectionStringBuilder Class Builder 将转义反斜杠并为 Sql Server 连接构建正确的连接字符串。

var builder = new SqlConnectionStringBuilder

    DataSource = @"IP_ADDRESS\INSTANCE",
    InitialCatalog = "DbName",
    UserID = "MyUserId",
    Password = "MyPassword"
;

var connectionString = builder.ConnectionString;

// Use connection string
optionsBuilder.UseSqlServer(connectionString );

所以你的方法可以如下所示:

private SqlConnectionStringBuilder BuilderFromElement(XElement source)

    return new SqlConnectionStringBuilder
    
        DataSource = source.Attribute("Server")?.Value,
        InitialCatalog = source.Attribute("Database")?.Value,
        UserID = source.Attribute("UserID")?.Value,
        Password = source.Attribute("Password")?.Value
    ;


private string GetConnectionString()

    var settings = XDocument.Load("Settings.xml");
    var allConnectionStrings = 
        settings.Descendants("DataSource")
                .Select(BuilderFromElement)
                .Select(builder => builder.ConnectionString)
                
    return allConnectionStrings.FirstOrDefault();

【讨论】:

OP 是 .net core 3.0?【参考方案2】:

查看您的 xml 文件中使用的反斜杠。

在某些情况下,\\ 可以是转义的 \,作为文字,它是 2 个斜线。

这段代码说明了一点:这些字符串不相等。

        String s= "Server=IP\\INSTANCE_NAME;Database=db;User id=User ;Password=pwd;";
    String s2= @"Server=IP\\INSTANCE_NAME;Database=db;User id=User ;Password=pwd;";

    Console.WriteLine(s2== s);

如果您使用 localhost 尝试此操作,它是否按您期望的方式工作? 如果是这样:罪魁祸首是。

你也可以看看这是否有效。

optionsBuilder.UseSqlServer(@"Server=Server=IP\\INSTANCE_NAME;Database=DB;User id=User ;Password=pwd;");

希望这会有所帮助!

【讨论】:

Omg~ 我已经在我的 XML 中更改了它;服务器="IP_ADDRESS\\INSTANCE" 到服务器="IP_ADDRESS\INSTANCE";它现在正在工作。谢谢@brian Chandley

以上是关于EF Core 3.0 手动设置连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

.NET 5 在使用 EF Core Power Tools 时正确注入 DbContext 连接字符串

为 ASP.NET Core 5.0 - EF Core 5.0 Web App 配置 PostgreSQL 连接字符串以在 MS 或 Linux 云上运行?

DB First,ASP Net Core 2.1,EF6:InvalidOperationException:在应用程序配置文件中找不到名为“DataContext”的连接字符串

EF+Sqlite 动态设置连接字符串

EF4 Code only ctp5:如何设置连接字符串 devart oracle?

sqlite + .net core ef 3