0

我正在尝试在运行时迁移带有实体框架的数据库。
这就是你通常会这样做的方式:

Database.SetInitializer<TContext>(new MigrateDatabaseToLatestVersion<TContext,TMigrationsConfiguration>);
            }

但是,直到运行时我才知道 TContext 或 TMigrationsConfiguration 。

我将如何使用运行时类型执行此方法?


更新 1

@Alexander Balte 的建议让我开始使用接口 IDatabaseInitializer

所以这编译没有错误:

foreach (IDatabaseInitializer<DbContext> initializer in moduleNeedingMigration.initializers)
{
     System.Data.Entity.Database.SetInitializer(initializer);
}

但是我不能这样做:

public IEnumerable<IDatabaseInitializer<DbContext>> initializers
    {
        get
        {
            List<IDatabaseInitializer<Module1Context>> list = new List<IDatabaseInitializer<Module1Context>>();
            MigrateDatabaseToLatestVersion<Module1Context, Configuration> init = new MigrateDatabaseToLatestVersion<Module1Context, Configuration>();
            list.Add(init);
            return list;//Error cannot convert type List<IDatabaseInitializer<Module1Context>> to IEnumerable<IDatabaseInitializer<DbContext>>
        }
    }

注意Module1Context 继承 DbContext


更新 2

这编译:

return list.Cast<IDatabaseInitializer<UpfContext>>();

但是,当我运行应用程序时,出现此错误:

System.Data.Entity.MigrateDatabaseToLatestVersion`2[Module1.Models.Module1Context,Module1.Migrations.Configuration]' to type 'System.Data.Entity.IDatabaseInitializer`1[System.Data.Entity.DbContext]'.
4

1 回答 1

0

如果您知道所有可能的集合,TContext或者TMigrationsConfiguration您可以创建类似工厂方法的东西,它将MigrateDatabaseToLatestVersion通过具体类型返回您TContextand TMigrationsConfiguration

就像是:

    private static Dictionary<Tuple<Type, Type>, Func<object>> _map = new Dictionary<Tuple<Type, Type>, Func<object>>();

    public static MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration> CreateMigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>(TContext type, TMigrationsConfiguration configuration)
    {
        Type contextType = typeof (TContext);
        Type configurationType = typeof(TMigrationsConfiguration);

        Func<object> builder;
        if (!_map.TryGetValue(new Tuple<Type, Type>(contextType, configurationType), out builder))
            throw new KeyNotFoundException();

        return (MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>)builder();
    }

字典_map应该使用所有可能的通用参数类型集进行初始化。喜欢:

_map[new Tuple<Type, Type>(typeof(MyDbContext), typeof(MyDbMigrationsConfiguration)) = () => new MigrateDatabaseToLatestVersion<MyDbContext, MyDbMigrationsConfiguration>();
于 2013-01-11T05:08:12.250 回答