EF Core 3.0 Ручная настройка строки подключения - PullRequest
0 голосов
/ 01 февраля 2019

Я разрабатываю консольное приложение с .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 голосов
/ 02 февраля 2019

Используйте правильный инструмент для задания - 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();
}
0 голосов
/ 01 февраля 2019

просмотреть используемую обратную косую черту в вашем 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;");

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...