Использование ObjectContext с connectionString в конфигурационном файле и динамическая загрузка пароля - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть класс, унаследованный от ObjectContext:

public class MyObjectContext: ObjectContext {

   [.....]

    public MyObjectContext()
        : base("name=MyObjectContext", "MyObjectContext")
    {
        ContextOptions.LazyLoadingEnabled = true;
    }

    public MyObjectContext(string connectionString)
        : base(connectionString, "MyObjectContext")
    {
        ContextOptions.LazyLoadingEnabled = true;
    }

    [.....]
}

И файл конфигурации У меня есть строка подключения для БД:

  <connectionStrings>
      <add name="RepoContext"
           connectionString="metadata=res://*/Repo.RepoModel.csdl|res://*/Repo.RepoModel.ssdl|res://*/Repo.RepoModel.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\MyDb.sdf;Password=12345&quot;"
           providerName="System.Data.EntityClient" />
  </connectionStrings>

То есть я хочу полностью удалить пароль из файла конфигурации и загрузить его - пароль - динамически внутри класса MyObjectContext. Остальная часть connectionString должна оставаться в конфигурации.

Как я могу это сделать?

Я не хочу шифровать connectionString в файле конфигурации.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

вызов функции из конструктора MyObjectContext, как это

 public MyObjectContext()
        : base(GetConnectionString())
    {
        ContextOptions.LazyLoadingEnabled = true;
    }

в вашей функции, чтобы получить строку подключения, сделайте это

private static string GetConnectionString()
{
  var connectStringValue = ConfigurationManager.ConnectionStrings["MyObjectContext"].ConnectionString;
  var entityBuilder = new EntityConnectionStringBuilder(connectStringValue);
  var factory = DbProviderFactories.GetFactory(entityBuilder.Provider);
  var providerBuilder = factory.CreateConnectionStringBuilder();

  if (providerBuilder == null)
        return entityBuilder.ToString();

  providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString;
  providerBuilder.Add("Password", "**yourpassword**");

  entityBuilder.ProviderConnectionString = providerBuilder.ToString();

  return entityBuilder.ToString();
}

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

0 голосов
/ 05 ноября 2018

Вы можете использовать базовый конструктор с перегрузкой со строкой соединения:

public MyObjectContext(string connectionString)
                 : base(connectionString)
{
     ContextOptions.LazyLoadingEnabled = true;
}

И назовите это так:

var cxt = new MyObjectContext(new EntityConnectionStringBuilder() {
                Metadata= "metadata=res://*/Repo.RepoModel.csdl|res://*/Repo.RepoModel.ssdl|res://*/Repo.RepoModel.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\MyDb.sdf;Password=+"PASSWORD"+&quot;",
                Provider = "System.Data.EntityClient"
            }.ConnectionString);
...