'未找到具有不变名称'FirebirdSql.Data.FirebirdClient'的ADO.NET提供程序的实体框架提供程序

问题描述

通过初始化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());
    ...

}