【问题标题】:Using ObjectContext with connectionString in a config file and loading password dynamically在配置文件中使用 ObjectContext 和 connectionString 并动态加载密码
【发布时间】:2018-11-05 13:32:26
【问题描述】:

我有一个继承自 ObjectContext 的类:

public class MyObjectContext: ObjectContext {

   [.....]

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

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

    [.....]
}

还有一个配置文件,我有一个 db 的连接字符串:

  <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 的其余部分必须保留在配置中。

我该怎么做?

我不想加密配置文件中的连接字符串。

【问题讨论】:

    标签: c# .net connection-string


    【解决方案1】:

    您可以使用带有连接字符串的重载的基本构造函数:

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

    【讨论】:

      【解决方案2】:

      像这样从 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();
      }
      

      希望对你有帮助

      【讨论】:

      • 1) ConfigurationManager -- 在任何地方都找不到,不在任何命名空间中;它在哪里? 2) GetConnectionString() 不是静态的
      • 1.包括这个命名空间“System.Configuration”,2. 更新
      猜你喜欢
      • 2017-12-02
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2023-04-01
      • 2018-02-11
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多