1

プロジェクトで MigrateDatabaseToLatestVersion からクラスを派生させたいと考えています。

public abstract class BaseDatabaseInitializer<TContext> : MigrateDatabaseToLatestVersion<TContext, MigrationConfiguration>
    where TContext : DbContext

MigrationConfiguration クラスは次のようになります

internal sealed class MigrationConfiguration : DbMigrationsConfiguration<QAdminDbContext>
{
    public MigrationConfiguration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(QAdminDbContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

しかし、私はそうすることを許可されておらず、エラーが発生しています

"Inconsistent accessibility: base class 'System.Data.Entity.MigrateDatabaseToLatestVersion<TContext,Lutron.Application.QAdmin.Database.EntityConfiguration.MigrationConfiguration>' is less accessible than class 'Lutron.Application.QAdmin.Database.BaseDatabaseInitializer<TContext>'    E:\Proj\Lutron\Code\src\Lutron\Gulliver\QAdmin\DataAccess\Database\BaseDatabaseInitializer.cs   17  27  Database"

これは、MigrateDatabaseToLatestVerion クラスが MigrationConfigurationContext の where 句を明示的に定義しているためです。

カスタム クラスで ' Configuration' クラスを明示的に定義したため、where 句を追加できません。

4

1 に答える 1

0

抽象初期化クラスはパブリック クラスですが、移行クラスは内部クラスであるため、エラーが発生します。両方をパブリック クラスに変更するか、両方を内部クラスに変更しますが、別の問題があります。

C# コンパイラは、誰かが を試すことができることを認識しますBaseDatabaseInitializer<SomeOtherContext>が、MigrationConfiguration クラスは SomeOtherContext の型パラメーターを使用して移行に変換できないため、コードをコンパイルできません。

考えられる解決策はいくつかありますが、達成しようとしていることに依存すると思います。移行の実行方法とタイミングをさらに制御したい場合は、おそらく別のアプローチを取り、IDatabaseInitializer を実装します。これにより、クラスをデータベース初期化子としてアプリケーションにプラグインできます。たとえば、次のようになります。

public abstract class BaseDatabaseInitializer<TContext> : 
    IDatabaseInitializer<TContext> where TContext : DbContext
{
    private readonly DbMigrationsConfiguration<TContext> _migrations;

    protected BaseDatabaseInitializer(DbMigrationsConfiguration<TContext> migrations)
    {
        _migrations = migrations;
    }

    public void InitializeDatabase(TContext context)
    {
        new DbMigrator(_migrations).Update();
    }
}
于 2013-11-10T14:46:20.203 に答える