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

时间:2019-02-01 18:16:47

标签: c# sql-server entity-framework .net-core

我正在使用.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);
}

DataServices类

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 Server。服务器未找到或无法访问。校验   实例名称正确并且已将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" />

2 个答案:

答案 0 :(得分:1)

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

在某些情况下,if可以是转义的\,从字面上看,它是2个斜杠。

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

\\

如果在localhost上尝试此操作,它是否可以按您期望的方式工作? 如果是这样,罪魁祸首就是。

您还可以查看是否可行。

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

希望这会有所帮助!

答案 1 :(得分:0)

为工作使用正确的工具-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();
}