簡體   English   中英

定義用於加密連接字符串的自定義DbConnectionFactory並將其設置為Entity Framework中的DefaultConnectionFactory

[英]Define a custom DbConnectionFactory for encrypt connection strings and set it as DefaultConnectionFactory in Entity Framework

我的解決方案中有一個BaseDbContext ,所有其他DbContexts繼承自它:

public BaseDbContext(string connectionstringName): base(connectionstringName)
{
  ....
}

最近,我添加了以下DbConnectionFactory來解密我的配置文件中的加密connectionstring DbConnectionFactory (我一次加密了配置文件):

public class EncryptedDbConnectionFactory : IDbConnectionFactory
{
   public EncryptedDbConnectionFactory()
   {
   }

   #region IDbConnectionFactory implementation
   public DbConnection CreateConnection(string nameOrConnectionString)
   {
      var connectionStringName = nameOrConnectionString.Replace("name=","");

      //Decrypt method get connectionstringName, and find connectionstring   from config 
      //and decrypt it

      var decryptedConnectionString = Decrypt(connectionStringName);
      var connection= new SqlConnection(decryptedConnectionString);
      return connection;
   }
   #endregion
}

並通過遵循DbConfiguration類將其設置為DefaultConnectionFactory

public class MyConfig : DbConfiguration
{
   public UseConnectionStringsConfig(bool useEncryptedDbConnectionFactory)
   {
     if (useEncryptedDbConnectionFactory)
     {
       SetProviderServices("System.Data.SqlClient",
                            System.Data.Entity.SqlServer.SqlProviderServices.Instance);
       SetDefaultConnectionFactory(new EncryptedDbConnectionFactory(configuration));
     }
     else
     {
        //use sqlConnectionFactory
     }
   }
}

並在program.cs開頭調用MyConfig (我也從app.config刪除了defaultConnectionFactory部分):

DbConfiguration.SetConfiguration(new MyConfig(true));

當我運行程序時,當控制權到達var context = new MyContext();時,出現以下異常var context = new MyContext(); 線:

引發異常:System.Data.dll中的“ System.ArgumentException”

附加信息:初始化字符串的格式不符合從索引0開始的規范。

如果我將BaseDbContext更改為:

public BaseDbContext(string connectionstringName)
      : base(Database.DefaultConnectionFactory
                     .CreateConnection(connectionstringName), true)
{
}

程序運行無任何異常; 但是通過使用Database.DefaultConnectionFactory作為DbContext構造函數的參數,我得到以下警告:

'Database.DefaultConnectionFactory'已過時:'應在配置文件中或使用DbConfiguration類設置默認連接工廠。 (請參閱http://go.microsoft.com/fwlink/?LinkId=260883

我有兩個問題:

  1. 我該如何解決此警告?(我的意思是,與使用Database.DefaultConnectionFactory作為DbContext構造函數的參數相比,我可以通過更好的方法解決問題)
  2. 為什么我以前的BaseDbContext無法正常工作?

I.警告說明了這一點。 您不應使用Database.DefaultConnectionFactory = new EncryptedDbConnectionFactory(true) 提示您應在配置文件中進行設置:

<entityFramework>
    <defaultConnectionFactory type="YourNamespace.EncryptedDbConnectionFactory, YourAssembly">
      <parameters>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      ........
    </providers>
  </entityFramework>

二。 出現異常的原因是連接字符串的格式不正確。 檢查您的解密方法,並查看您的最終連接字符串是否格式正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM