Я пытаюсь добавить миграции в проект, который использует Fluent NHibernate для вызова базы данных. Проблема в том, что я хотел сделать это в стиле Entity Framework, добавить миграции или применить их из консоли диспетчера пакетов.
Для этого я использовал FluentMigrator и FluentMigrator.NHibernate , и после портирования второго на. Net Standard и проверки того, что все идет хорошо, я начал работать над сценарием Powershell, который запускает «Add-Migration» из пакета консоль менеджера.
Проблема в том, что когда программа пытается создать конфигурацию NHibernate, она выдает исключение TypeInitializationException для NHibernate.NHibernateLogger. И InnerException говорит:
System.TypeInitializationException: The type initializer for 'NHibernate.Cfg.Environment' threw an exception.
---> System.TypeInitializationException: The type initializer for 'NHibernate.NHibernateLogger' threw an exception.
---> System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize
---> System.PlatformNotSupportedException: Operation is not supported on this platform.
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.get_ConfigPaths()
at System.Configuration.ClientConfigurationHost.GetStreamName(String configPath)
at System.Configuration.ClientConfigurationHost.get_IsAppConfigHttp()
at System.Configuration.Internal.DelegatingConfigHost.get_IsAppConfigHttp()
at System.Configuration.ClientConfigurationSystem..ctor()
at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
--- End of inner exception stack trace ---
at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
at System.Configuration.ConfigurationManager.PrepareConfigSystem()
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.get_AppSettings()
at NHibernate.NHibernateLogger.GetNhibernateLoggerClass()
at NHibernate.NHibernateLogger..cctor()
--- End of inner exception stack trace ---
at NHibernate.NHibernateLogger.For(Type type)
at NHibernate.Cfg.Environment..cctor()
--- End of inner exception stack trace ---
at NHibernate.Cfg.Configuration.Reset()
at NHibernate.Cfg.Configuration..ctor(SettingsFactory settingsFactory)
at NHibernate.Cfg.Configuration..ctor()
at JobsEngine.Migrations.BaseConfig.MigrationsConfiguration.GetConfiguration()
Это вызывается при создании конфигурации с использованием NHibernate, например так:
protected override Configuration GetConfiguration()
{
Configuration config = new Configuration(); //this is what throws the exception
config = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012.Dialect<MsSql2012Dialect>())
.Mappings(x => x.FluentMappings.AddFromAssembly(MigrationAssembly))
.BuildConfiguration();
return config;
}
И поиск информации для этого «Операция не поддерживается на этой платформе «Исключение, кажется, что бросает именно эту часть кода:
exeAssembly = Assembly.GetEntryAssembly();
if (exeAssembly == null)
throw new PlatformNotSupportedException();
в этой строке corefx .
Я понимаю, что это не так работать, потому что я запускаю его из скрипта Powershell, получая сборку и т. д., чтобы не было «входной сборки» (GetEntryAssembly возвращает ноль). Если я запускаю из консольного проекта или модульного теста, он работает отлично. Есть ли обходной путь или решение этой проблемы? Я хотел бы иметь возможность запускать его из скрипта powershell.
Я должен сказать, что все библиотеки, на которые есть ссылки, используются (или должны использовать). Net standard.
EDIT: соответствующая часть сценария powershell, используемая для запуска этого:
$migration = [FluentMigrator.NHibernate.PSEntryPoint]::Generate($targetPath, $MigrationName)
Где $ MigrationName - строка, а targetPath - путь сборки, в которой выполняются миграции, после того, как она была построена с использованием EnvDTE :
$configuration = $DTE.Solution.SolutionBuild.ActiveConfiguration.Name
$DTE.Solution.SolutionBuild.BuildProject($configuration, $project.UniqueName, $true)
Где PSEntryPoint:
public static class PSEntryPoint
{
public static object Generate(string targetPath, string migrationName)
{
MigrationConfigurationBase migrationConfiguration = GetMigrationConfigFromAssembly(targetPath);
return migrationConfiguration.Generate(migrationName, targetPath);
}
private static MigrationConfigurationBase GetMigrationConfigFromAssembly(string assemblyName)
{
var assembly = Assembly.LoadFrom(assemblyName);
var migrationConfigTypes = assembly.GetTypes().Where(x => x != null && x.IsClass && !x.IsAbstract
&& typeof(MigrationConfigurationBase).IsAssignableFrom(x)).ToList();
var migrationConfig = Activator.CreateInstance(migrationConfigTypes.First()) as MigrationConfigurationBase;
return migrationConfig;
}
В целом это работает, создается экземпляр конфигурации миграции, запускается «Генерация», но когда он попадает в новую конфигурацию из NHibernate выбрасывает платформу, которая не поддерживается.