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れるファクトリ メソッドのようなものを作成することができます。MigrateDatabaseToLatestVersionTContextTMigrationsConfiguration

何かのようなもの:

    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 に答える