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 回答