EF Code First Migration:如何继承MigrateDatabaseToLatestVersion

时间:2013-11-06 06:22:14

标签: entity-framework ef-migrations

我想在我的项目中从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子句。

1 个答案:

答案 0 :(得分: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();
    }
}