如何以编程方式选择 DbConfigurationType
本文关键字:选择 DbConfigurationType 方式 编程 | 更新日期: 2023-09-27 17:56:26
我有一个DbContext
:
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyDbContext : DbContext
{
public DbSet<MyClass> MyClasses { get; set; }
}
现在,如果我希望能够根据应用程序设置值使用其他DbConfigurationType
怎么办?
因此,我将应用程序设置值从MySQL
更改为MSSQL
,它变为:
[DbConfigurationType(typeof(MsSqlEFConfiguration))]
public class MyDbContext : DbContext
{
public DbSet<MyClass> MyClasses { get; set; }
}
当然,我可以创建一个工厂,并使用反射创建一个具有自定义属性的新类。但是,有没有没有反思的解决方案?
我已经通过继承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
{
}
您可以将该属性替换为运行时在锁定配置之前拦截配置的注册:
DbConfiguration.Loaded += (_, a) =>
{
a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s));
a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s));
};
源