/// <summary> /// Collect migrations in one <c>Assembly</c>. /// </summary> /// <param name="asm">The <c>Assembly</c> to browse.</param> private static List<MigrationInfo> GetMigrationInfoList(Assembly asm) { var migrations = new List<MigrationInfo>(); foreach (Type type in asm.GetExportedTypes()) { var attribute = type.GetCustomAttribute<MigrationAttribute>(); if (attribute != null && typeof(IMigration).IsAssignableFrom(type) && !attribute.Ignore) { var mi = new MigrationInfo(type); migrations.Add(mi); } } migrations.Sort(new MigrationInfoComparer()); // пишем в лог список загруженных миграций StringBuilder logMessageBuilder = new StringBuilder("Loaded migrations:").AppendLine(); foreach (MigrationInfo mi in migrations) { string msg = string.Format("{0} {1}", mi.Version.ToString().PadLeft(5), StringUtils.ToHumanName(mi.Type.Name)); logMessageBuilder.AppendLine(msg); } MigratorLogManager.Log.Info(logMessageBuilder.ToString()); return migrations; }
/// <summary> /// Создать миграцию по номеру версии /// </summary> /// <param name="migrationInfo">Информация о миграции</param> /// <param name="provider">Провайдер СУБД для установки в качестве текущего провайдера миграции</param> public IMigration InstantiateMigration(MigrationInfo migrationInfo, ITransformationProvider provider) { Require.IsNotNull(provider, "Не задан провайдер СУБД"); Require.IsNotNull(migrationInfo.Type, "Не задан класс миграции"); var migration = (IMigration)Activator.CreateInstance(migrationInfo.Type); migration.Database = provider; return migration; }