Как вставить код в строку соединения в модели данных сущностей ADO.Net - программирование
Подтвердить что ты не робот

Как вставить код в строку соединения в модели данных сущностей ADO.Net

Я слежу за этим руководством по созданию службы OData.

http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowIncludingXMLAndJSONIn30Minutes.aspx

И он работает безупречно... но, в Мастере моделей данных Entity, когда он просит вас "Выберите соединение с данными", он дает вам это предупреждение.

"Эта строка подключения содержит конфиденциальные данные (например, пароль), необходимые для подключения к базе данных. Хранение конфиденциальных данных в строке соединения может представлять угрозу безопасности. Вы хотите включить эти конфиденциальные данные в строка соединения?"

Если я выберу: "Нет, исключить конфиденциальные данные из строки подключения. Я установлю его в своем коде приложения".

Я не вижу, где могу, "в моем коде приложения" вставить пароль. (Моя компания хранит их в зашифрованном виде в реестре)

Кроме того, у меня есть несколько БД, с которыми мне нужно подключиться, в зависимости от среды (Dev, CA или Prod), и мне нужно знать, на что ссылается DB в строке подключения, чтобы получить правильный пароль.

Спасибо.

4b9b3361

Ответ 1

При создании контекста вы можете установить строку подключения. Чтобы построить эту строку соединения, вы можете проанализировать строку соединения без пароля с помощью EntityConnectionStringBuilder, а затем проанализировать внутреннюю строку соединения с другим ConnectionStringBuilder, в зависимости от вашего браузера. Затем вы можете установить пароль и передать его конструктору.

var originalConnectionString = ConfigurationManager.ConnectionStrings["your_connection_string"].ConnectionString;
var entityBuilder = new EntityConnectionStringBuilder(originalConnectionString);
var factory = DbProviderFactories.GetFactory(entityBuilder.Provider);
var providerBuilder = factory.CreateConnectionStringBuilder();

providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString;

providerBuilder.Add("Password", "Password123");

entityBuilder.ProviderConnectionString = providerBuilder.ToString();

using (var context = new YourContext(entityBuilder.ToString()))
{
    // TODO
}

Ответ 2

Измените конструктор объектов

 public sampleDBEntities() : base("name=sampleDBEntities")
    {
        this.Database.Connection.ConnectionString = @"Data Source=.\;Initial Catalog=sampleDB;Persist Security Info=True;User ID=sa;Password=Password123"; ;
    }

Ответ 3

Я добавил пароль "dummy" в файл конфигурации ( "XXXXX" ), а затем заменил это значение на реальный пароль в конструкторе сущности

public MyDatabaseContainer() : base("name=MyDatabaseContainer")
{
    Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXX","realpwd");
}

Ответ 4

Мое примерное приложение было написано в режиме "Database First", а метод "CreateNewConnectionString" ниже работает просто отлично (хотя он выглядит не очень элегантно.)

Метод "CreateNewConnectionString2" выглядит очень элегантно, но вызывает исключение, говорящее мне, что он действителен только в режиме "Первый код".

Итак, я предоставляю оба метода вместе с конструктором, который я модифицировал, чтобы использовать мои методы. ПРИМЕЧАНИЕ и ОБНОВЛЕНИЕ, я изменил код, сгенерированный шаблоном, и который может быть перезаписан, если код регенерируется. Мне кажется, что это подходящее место.

Если ваше приложение было сгенерировано в режиме "Первый код", вам может потребоваться использовать "CreateNewConnectionString2" (я еще не тестировал эту опцию.)

Я спешу признать, что я скопировал оба блока кода из других сообщений, поскольку я еще не знаю почти достаточно обо всем этом, чтобы написать свой собственный код.

private static string CreateNewConnectionString(string connectionName, string password)
        {
        var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~").ConnectionStrings.ConnectionStrings[connectionName];
       //or:
       //var config = ConfigurationManager.ConnectionStrings[connectionName];
        var split = config.ConnectionString.Split(Convert.ToChar(";"));
        var sb = new System.Text.StringBuilder();

        for (var i = 0; i <= (split.Length - 1); i++)
        {
            if (split[i].ToLower().Contains("user id"))
            {
                split[i] += ";Password=" + password;
            }

            if (i < (split.Length - 1))
            {
                sb.AppendFormat("{0};", split[i]);
            }
            else
            {
                sb.Append(split[i]);
            }
        }
        return sb.ToString();
    }

    private static string CreateNewConnectionString2(string connectionName, string password)
    {
        var originalConnectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
        var entityBuilder = new EntityConnectionStringBuilder(originalConnectionString);
        var factory = DbProviderFactories.GetFactory(entityBuilder.Provider);
        var providerBuilder = factory.CreateConnectionStringBuilder();

        providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString;

        providerBuilder.Add("Password", password);

        entityBuilder.ProviderConnectionString = providerBuilder.ToString();
        return entityBuilder.ProviderConnectionString;
    }

    public ChineseStudyEntities()
        : base(CreateNewConnectionString("ChineseStudyEntities", "put YOUR password here")) // base("name=ChineseStudyEntities")
    {
    }