问题描述
通过初始化MYDbMigrator,将获得有关未找到提供程序的异常。 Firebird是否以其他任何方式支持迁移以注册提供程序。还尝试使用appconfig进行配置,但是无法识别配置部分system.data。
总的来说,我试图加载来自不同程序集的迁移并按顺序执行它们,但是我却坚持要注册提供程序。它不能将DbConnection传递给TMigrationsConfiguration.TargetDatabase,因为它需要DbConnectionInfo。 如何注册Firebiredsql.Data.FirebirdClinent,以便可以在应用程序生存期内找到它。
public abstract class MYBaseEntityContext : DbContext
{
protected MYBaseEntityContext() : base(connection,true)
{
Configuration.LazyLoadingEnabled = true;
Configuration.ProxyCreationEnabled = true;
Configuration.AutoDetectChangesEnabled = true;
Configuration.ValidateOnSaveEnabled = true;
}
}
public class MYDbMigrator<TContext,TMigrationsConfiguration> : DbMigrator
where TContext : MYBaseEntityContext
where TMigrationsConfiguration : MYDataMigrationConfiguration<TContext>,new()
{
public MYDbMigrator(DbConnection connection)
: base(new TMigrationsConfiguration()
{
TargetDatabase = new DbConnectionInfo(connection.ConnectionString,"Firebirdsql.Data.FirebirdClient")
})
{ }
}
public class MYDataMigrationConfiguration<TDataContext> :
DbMigrationsConfiguration<TDataContext>
where TDataContext : MYBaseEntityContext
{
public MYDataMigrationConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
SetHistoryContextFactory("Firebirdsql.Data.FirebirdClient",(connection,defaultSchema) => new BaseHistoryDataContext(connection,defaultSchema));
SetsqlGenerator("Firebirdsql.Data.FirebirdClient",new FbMigrationsqlGenerator());
}
}
private static FbConnection connection
{
get
{
FbConnectionStringBuilder b = new FbConnectionStringBuilder
{
ServerType = FbServerType.Embedded,UserID = "sysdba",Password = "masterkey",DataSource = "localhost",Database = "MYMigrations.fdb",ClientLibrary = "fbclient.dll",Dialect = 3
};
return new FbConnection(b.ToString());
}
}
[![enter image description here][1]][1]
[1]: https://i.stack.imgur.com/ZqwSn.png
解决方法
public abstract class MYBaseEntityContext : DbContext
{
public class FirebirdConfiguration : DbConfiguration
{
public FirebirdConfiguration()
{
SetDefaultConnectionFactory(new FbConnectionFactory());
SetProviderFactory(FbProviderServices.ProviderInvariantName,FirebirdClientFactory.Instance);
SetProviderServices(FbProviderServices.ProviderInvariantName,FbProviderServices.Instance);
DbProviderFactories.RegisterFactory(FbProviderServices.ProviderInvariantName,FirebirdClientFactory.Instance);
}
}
}
MyApp.OnStartup(StartupEventArgs e)
{
...
DbConfiguration.SetConfiguration(new MYBaseEntityContext.FirebirdConfiguration());
...
}