2016-07-12 111 views
0

我有一个DbContext如何以编程方式选择DbConfigurationType?

[DbConfigurationType(typeof(MySqlEFConfiguration))] 
public class MyDbContext : DbContext 
{ 
    public DbSet<MyClass> MyClasses { get; set; } 
} 

现在,如果我希望能够用另一种DbConfigurationType什么,根据AppSettings的价值?

这样,我的AppSettings值改为从MySQLMSSQL它变成:

[DbConfigurationType(typeof(MsSqlEFConfiguration))] 
public class MyDbContext : DbContext 
{ 
    public DbSet<MyClass> MyClasses { get; set; } 
} 

当然,我可以创建一个工厂,使用反射来创建自定义属性的新类。但是,有没有反思的解决方案?

+0

@ Uno的配置类型不同,'MySqlEFConfiguration' vs'MsSqlEFConfiguration' – stuartd

+0

请原谅!我懒惰的眼睛... –

+0

看看这个答案︰http://stackoverflow.com/questions/20354083/ef6-and-multiple-configurations-sql-server-and-sql-server-compact –

回答

1

我已经从DbConfigurationTypeAttribute继承解决了这个问题:

public class BaseEfConfiguration : DbConfigurationTypeAttribute 
{ 
    public BaseEfConfiguration() : base(SqlConfiguration) 
    { 
    } 

    public static Type SqlConfiguration 
    { 
     get 
     { 
      string databaseTypeName = ConfigurationManager.AppSettings["DatabaseType"]; 
      switch (databaseTypeName) 
      { 
       case "MySQL": 
        return typeof(MySqlEFConfiguration); 
       case "MSSQL": 
        return typeof(MsSqlEFConfiguration); 
       default: 
        throw new NotImplementedException($"No such SQL configuration type {databaseTypeName}"); 
      } 
     } 
    } 
} 

[BaseEfConfiguration] 
public class BaseDbContext : DbContext 
{ 

} 
0

之前它锁定您可以替换在运行时拦截的配置注册属性:

DbConfiguration.Loaded += (_, a) => 
    { 
     a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s)); 
     a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s)); 
    }; 

Source