我想在我的项目中从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子句。
答案 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();
}
}