为加密连接字符串定义自定义DbConnectionFactory,并在Entity Framework中将其设置为DefaultConnectionFactory

时间:2016-09-28 06:04:21

标签: c# entity-framework customization dbconnectionfactory

我的解决方案中有一个BaseDbContext,其他所有DbContexts都从中继承:

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

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

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
}

并按照DefaultConnectionFactory类:

将其设置为DbConfiguration
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
     }
   }
}

并在我的MyConfig开始时致电program.cs(我也从defaultConnectionFactory删除了app.config部分):

DbConfiguration.SetConfiguration(new MyConfig(true));

当我运行程序时,当控件到达var context = new MyContext();行时,我会得到以下异常:

  

抛出异常:' System.ArgumentException'在System.Data.dll

中      

附加信息:初始化字符串的格式不符合从索引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无法正常工作?

1 个答案:

答案 0 :(得分:0)

予。警告解释说。你不应该使用Database.DefaultConnectionFactory = new EncryptedDbConnectionFactory(true)。你应该在配置文件中设置它:

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

II。异常的原因是连接字符串的格式不正确。检查您的解密方法,看看您的最终连接字符串格式是否正确。