1

Migrationsクラスの名前を文字列として指定した場合、Orchard_Framework_DataMigrationRecordに格納されている現在のバージョン番号を取得するにはどうすればよいですか?

IExtensionManagerでバージョンを確認できますが、module.txtで定義されているモジュールバージョンのようです。

4

1 に答える 1

0

OK、だから私はこれを自分で解決しました-

Orchardは、移行メソッドを起動するときに必要なコードと同様のコードをすでに実行している必要があることを知っていたので、新しい移行ファイルを作成し、Create()メソッドにブレークポイントを設定しました。ブレークポイントがヒットしたとき、コールスタックを調べて、Orchard.Data.MigrationでDataMigrationManagerを見つけました。必要なものはすべてそこにありました。他の誰かが同様の要件を持っている場合は、そのクラスを出発点として検討することをお勧めします。

これは、そのクラスからほとんどまっすぐに持ち上げられます。

        string moduleName="Your.Module.Name";
        var migrations = GetDataMigrations(moduleName);

        // apply update methods to each migration class for the module
        var current = 0;
        foreach (var migration in migrations)
        {
            // copy the objet for the Linq query
            var tempMigration = migration;

            // get current version for this migration
            var dataMigrationRecord = GetDataMigrationRecord(tempMigration);

            if (dataMigrationRecord != null)
            {
                current = dataMigrationRecord.Version.Value;
            }

            // do we need to call Create() ?
            if (current == 0)
            {
                // try to resolve a Create method

                var createMethod = GetCreateMethod(migration);
                if (createMethod != null)
                {
                    //create method has been written, but not executed!
                    current = (int)createMethod.Invoke(migration, new object[0]);
                }
            }
        }
        Context.Output.WriteLine("Version: {0}", current);

あなたが必要とするかもしれないいくつかの方法:

    private DataMigrationRecord GetDataMigrationRecord(IDataMigration tempMigration)
    {
        return _dataMigrationRepository.Table
            .Where(dm => dm.DataMigrationClass == tempMigration.GetType().FullName)
            .FirstOrDefault();
    }

    private static MethodInfo GetCreateMethod(IDataMigration dataMigration)
    {
        var methodInfo = dataMigration.GetType().GetMethod("Create", BindingFlags.Public | BindingFlags.Instance);
        if (methodInfo != null && methodInfo.ReturnType == typeof(int))
        {
            return methodInfo;
        }

        return null;
    }

必要になる可能性のある依存関係を挿入することを忘れないでください。

于 2012-12-08T12:58:02.550 に答える